您的位置:首页 > 编程语言 > C语言/C++

总结c++的“编译、链接”时引发的血案——动态、静态链接库

2012-06-07 21:00 295 查看
动态链接库

生成一个动态链接库应包含两个文件 *.dll *.lib。

lib是编译时需要的,dll是运行时需要的。

如果要完成源代码的编译,有lib就够了。

如果要使动态连接的程序运行起来,有dll就够了。

lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。

Dll文件包含函数的实现,是可执行的代码。

Lib文件是dll的一个映像文件,一般包含一些索引信息,如DLL导出的函数的名称和位置等。

两种调用方式:隐式调用、显示调用。

隐式调用:应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到exe文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址。(lib文件是必须的)

步骤:

   1、保证a.dll和a.lib两个文件都有

2、将要调用的函数的声明和下面的语句写到一个头文件中

#pragma comment(lib, "a.lib")   ////指定与静态库一起连接

 

显示调用:如果dll没有对应的.lib文件,那么就只能使用显示调用(动态加载)的方式了。

动态调用动态库步骤:

1、创建一个函数指针,其指针数据类型要与调用的DLL引出函数相吻合。

2、通过Win32 API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄。

3、通过Win32 API函数GetProcAddress()获取要调用的DLL的函数地址,把结果赋给自定义函数的指针类型。

4、使用函数指针来调用DLL函数。

5、最后调用完成后,通过Win32 API函数FreeLibrary()释放DLL函数。

静态链接库

如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。  

 

lib库有两种,

一种是包含了函数所在DLL文件和文件中函数位置的信息,称为导出库,就是动态lib;简单点说就是相当于一个.h头文件,对dll文件(.c文件)进行声明。

一种是函数索引和实现都在其中,编译后相关的代码嵌入到宿主程序。

 

###################################################################################

在vc工具中有Project->dependencies的选项,想请教下什么才需要使用该选项,使用后有什么效果?

表示项目依赖项,一般大的工程软件都放在一个解决方案里面,分了好多模块(都是以工程方式组织在一起,或dll,或lib)。这样也是为了保证工程的同步开发的方便。工程之间的链接可以动态链接:使用 LoadLibrary装入库,也可以静态链接,在工程配置中添加附加依赖库,或者在代码中使用 #pragma comment(lib,"xxx.lib);还有就是你所说的方式:在Project->dependencies 中设置,主要是为了保证系统编译时候的顺序,既先编译无依赖项的项目,在编译其父依赖的项目。跟静态链接的效果是一样的。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

在vc工具中,多个静态的lib,可以合并成一个静态的lib吗?

答:可以的。例如,合并后的lib为 hb.lib,它是a.lib,b.lib的合并。两种方案:

1)新建一个win32  static Library,取名为hb.dsp,然后在该工程添加文件 a.lib,b.lib,编译hb.dsp,就可以得到hb.lib。

2)新建一个win32  static Library,取名为hb.dsp,同时在工作空间workspace里添加能够生成a.lib和b.lib的工程dsp加入到该workspace中,然后选择 工程->从属性...,在弹出的对话框中 选择 a.dsp,b.dsp。最后编译hb.dsp,就可以得到hb.lib。

通过以上步骤,hb.lib中就包含了a.lib和b.lib的函数实现。

例如:以demo工程为例。原来的demo 从属于 cximage,jasper,jbig,jpeg,libdcr,mng,png,tiff,zib。如图1所示。



                                    图1

现在新建一个工程hb.dsp,(该工程的目的是把cximage,jasper,jbig,jpeg,libdcr,mng,png,tiff,zib八个工程对应的八个静态库合并成一个静态lib。所以在hb.dsp工程,选择从属性...,将cximage,jasper,jbig,jpeg,libdcr,mng,png,tiff,zib八个工程隶属于hb,如图2所示。



                                                                                         图2

在vc工具中,动态链接库dll对象的导出库lib文件,可以在工程-》设置-》链接里面添加,也可以直接在工程里添加文件的形式。

如上面的图1,图2.wininet.lib是wininet.dll的导出库。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ dll tiff library api 工具