什么是库
库是一组文件 ,其中包含了可以让不同程序或者其它库共享的代码;c++同样继承了库文件的设计思想;
库的种类
我们知道,库分为静态连接库和动态连接库(dll)两种之分,静态连接是在编译时插入,动态连接库是在运行时连接;
下面我们通过一个摄氏度转换的例子来学习这两种库文件的编写:
静态库:
构建函数库的第一步是确定函数的组织原则,也就是库中到底包含那种函数;一个库主要包含下列文件:
1) 头文件 ,包含库中所有项目的声明和原型,它被include指令插入到程序中,是程序和库之间的接口,头文件有时也被叫做接口文件
2)实现文件,是头文件中声明的项目的具体实现,必须被分开编译和链接到程序中
3)文档文件,包含库项目的详细说明
下面我们通过一个例子来看静态库的实现:
功能: 用来实现温度各种单位之间的转换
1: 编写头文件 heat.h
//heat.h 库提供一个接口 ,其中包含与热相关的函数
//头文件包含了库中所有项目的声明和原形,是程序和库之间的接口
const double HEAT_OF_FUSION = 79.71; //卡尔一克
const double HEAT_OF_VAPORIZATION = 539.35; //卡尔一克
double fahrToCelsius(double tempFahr); //华氏度转换为摄氏度
double celsiusToFahr(double tempCels); //摄氏度转换为华氏度
double fahrTokelvin(double tempFahr); //华氏度转换为开尔文
double kelvinToFahr(double tempKelv); //开尔文转换为华氏度
double celsiusToKelvin(double tempCels); //摄氏度转换为开尔文
double kelvinToCelsius(double tempKelv); //开尔文转换为摄氏度
|
2:编写heat.h的实现文件
//heat.h 的实现文件
#include "heat.h"
/*----------------------------*/
double fahrToCelsius(double tempFahr) { return (tempFahr - 32.0)/1.8; }
double celsiusToFahr(double tempCels) { return (tempCels*1.8+32.00); }
double fahrTokelvin(double tempFahr) //华氏度转换为开尔文
{ return (tempFahr-32.0)/1.8+273.0; }
double kelvinToFahr(double tempKelv) //开尔文转换为华氏度
{ return (tempKelv-273.0)*1.8+32.0; }
double celsiusToKelvin(double tempCels) //摄氏度转换为开尔文
{ return tempCels+273.0; }
double kelvinToCelsius(double tempKelv) //开尔文转换为摄氏度
{ return tempKelv-273.0; }
|
3)编写一个文件测试库是否能正常使用
#include<iostream> using namespace std;
#include "heat.h"
int main() { cout<<"这是一个温度转换程序\n" "将华氏温度转换为摄氏温度. \n"; cout<<"请输入华氏温度值: \n"; double tempFahrenheit; cin>>tempFahrenheit;
double tempCelsius = fahrToCelsius(tempFahrenheit);
cout<<tempFahrenheit<<" 的华氏温度相当于 "<<tempCelsius<<"摄氏度"<<endl; return 0; }
|
在这里,有一点需要注意:如果是在linux中,过程如下:
g++ -c heat.h
g++ -c cover.h
g++ heat.o conver.o -o conver
如果在visual c++ 中,则新建一个工程文件,注意是win32 控制台程序,将上面三个文件添加进去,才能顺利编译;否则,会出现link2001链接错误;
二: 动态链接库的编写
现在就开始。在Visual C++中,从「File」菜单选择「New」,然后选择「Workspaces」页面标签。(我们以前从来没有选择过。)在「Location」栏选择工作空间要储存的目录,然后在「Workspace Name」栏输入「heat」,按Enter键。
这样就建立了一个空的工作空间。Developer Studio还建立了一个名为EDRTEST的子目录,以及工作空间文件EDRTEST.DSW(就像两个其它文件)。
现在让我们在此工作空间里建立一个项目。从「File」菜单选择「New」,然后选择「Projects」页面标签。尽管过去您选择「Win32 Application」,但现在「Win32 Dynamic-Link Library」。另外,单击单选按钮「Add To Current Workspace」,这使得此项目是「heat」工作空间的一部分。在「Project Name栏输入heatlib,但先不要按「OK」按钮。当您在Project Name栏输入heatlib时,Visual C++将改变「Location」栏,以显示heatlib作为heat的一个子目录。这不是我们要的,所以接着在「Location」栏删除heatlib子目录以便项目建立在heat目录。现在按「OK」。屏幕将显示一个对话框,询问您建立什么型态的DLL。选择「An Empty DLL Project」,然后按「Finish」。Visual C++将建立一个项目文件heat.DSP和一个构造文件heatlib.MAK(如果「Tools Options」对话框的B「uild页面卷标中选择了「Export Makefile」选项」。
现在您已经在此项目中添加了一对文件。从「File」菜单选择「New」,然后选择「Files」页面标签。选择「C/C++ Header File」,然后输入文件名heat.H。输入程序21-1所示的文件(或者从本书光盘中复制)。再次从「File」菜单中选择「New」,然后选择「Files」页面标签。这次选择「C++ Source File」,然后输入文件名heatlib.Cpp。继续输入程序21-1所示的程序。
heat.h
//heat.h 库提供一个接口 ,其中包含与热相关的函数
//头文件包含了库中所有项目的声明和原形,是程序和库之间的接口
#ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif
EXPORT double CALLBACK fahrToCelsius(double tempFahr); //华氏度转换为摄氏度
EXPORT double CALLBACKcelsiusToFahr(double tempCels); //摄氏度转换为华氏度
EXPORT double CALLBACKfahrTokelvin(double tempFahr); //华氏度转换为开尔文
EXPORT double CALLBACKkelvinToFahr(double tempKelv); //开尔文转换为华氏度
EXPORT double CALLBACKcelsiusToKelvin(double tempCels); //摄氏度转换为开尔文
EXPORT double CALLBACKkelvinToCelsius(double tempKelv); //开尔文转换为摄氏度
|
heatlib.cpp文件
//heat.h 的实现文件
#include<windows.h>
#include "heat.h"
/*----------------------------*/ int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { return TRUE ; }
EXPORT double CALLBACK fahrToCelsius(double tempFahr) { return (tempFahr - 32.0)/1.8; }
EXPORT double CALLBACK celsiusToFahr(double tempCels) { return (tempCels*1.8+32.00); }
EXPORT double CALLBACK fahrTokelvin(double tempFahr) //华氏度转换为开尔文
{ return (tempFahr-32.0)/1.8+273.0; }
EXPORT double CALLBACK kelvinToFahr(double tempKelv) //开尔文转换为华氏度
{ return (tempKelv-273.0)*1.8+32.0; }
EXPORT double CALLBACK celsiusToKelvin(double tempCels) //摄氏度转换为开尔文
{ return tempCels+273.0; }
EXPORT double CALLBACK kelvinToCelsius(double tempKelv) //开尔文转换为摄氏度
{ return tempKelv-273.0; }
|
这样我们就得到了一个heat.dll这个动态链接库文件文件。关于这个文件如何使用,我下次在说;
阅读(2038) | 评论(0) | 转发(0) |