Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1801671
  • 博文数量: 290
  • 博客积分: 10653
  • 博客等级: 上将
  • 技术积分: 3178
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 23:08
文章存档

2013年(6)

2012年(15)

2011年(25)

2010年(86)

2009年(52)

2008年(66)

2007年(40)

分类: C/C++

2008-11-25 17:58:35

什么是库
 
 库是一组文件 ,其中包含了可以让不同程序或者其它库共享的代码;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这个动态链接库文件文件。关于这个文件如何使用,我下次在说;

阅读(2027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~