Lib文件
先来说一说lib文件,C++中lib文件主要有两类,一种是静态的编译连接,叫做静态链接库,另一种是动态的编译链接,和Dll文件一起使用,在该小标题下,主要说一下静态链接库,另一种将在Dll文件中讲解。所谓的静态链接库,就是以.lib结尾的文件(由于有动态的编译链接的lib存在,因此并不是所有的.lib文件都是静态链接库文件),该文件可以通过VS2005建立工程,然后将项目属性中的输出设置成lib形式,编译后就可以生成一个.lib文件,这就是静态链接库。
- 我们如何使用生成的.lib文件呢?
为了可以使用.lib文件,我们需要刚刚生成的.lib文件,以及它所对应的头文件.h,因为.lib文件无法直接访问,且无法得知其接口,因此需要对应的头文件。假设现在有一个工程需要使用该lib文件,首先需要在工程属性中将.h文件的路径设置好,在文件中使用#include将头文件包含,然后对于lib文件,需要在工程属性中,设置其路径(或者直接放在工程文件的目录下,因为工程查找文件时是以工程文件所在路径为相对路径查找),然后类似opencv一样,在项目属性中,linker->input中输入要使用的lib名(或者使用program**,在文件中用语句将其写入(推荐)),这样配置就结束了。
- lib文件如何起作用?
当工程在编译的时候,系统就会将lib中的函数的实现插入到生成的exe中,从而完成其作用,因此我们知道,当lib很大的时候,最后生成的exe文件会相当的大,因为将需要的lib都加载到了最终的exe中。
(补充:VS程序编译过程:预处理(.h文件展开、宏。。。。)——》编译(每个.cpp分别编译,)——》连接(链接静态库,即把lib中的函数实现插入并生成exe))这个后面专门写个日志,详细说说。
DLL文件
了解了上面的内容后,Dll的理解就方便多了。DLL文件被称为动态链接库。我们可以通过使用工程建立他们,在建立的时候首先建立一个空项目,然后将输出设置成dll,然后在主函数前使用***,意思是将该文件函数以dll文件导出,然后编译后生成了.lib文件和dll文件,其中的dll文件就是动态链接库,但是要注意这里的.lib文件就是上面所说的另一种lib文件,不同于静态链接库的lib文件(该lib文件中货真价实的是函数的实现),该lib文件中没有函数的实现,而也是一些定义以及配置,真正的函数的实现存在于dll文件中。
- 我们如何使用生成的.lib和dll文件呢?
要想使用dll文件,需要其对应的头文件.h,lib以及动态链接库dll文件。前两者的配置和上面一样,dll直接放到exe文件下即可。
- lib和dll文件如何起作用?
当一个工程在编译的时候,dll配套的lib文件将被使用,用来安插和dll文件的接口,但是不会将函数的实现放到最终的exe中,当exe程序在使用的时候,会动态的从对应的dll文件中调出需要的函数。因此这种方式使得exe文件不至于很大,而且方便应用程序的修改和升级。
VS生成DLL没有生成LIB文件的解决方法
1、在所建工程上单击鼠标右键,在弹出的右键菜单中选择“添加-->新建项....---->模块定义文件”,在该模块定义文件中写导出函数表,单击确定。然后在所建工程上单击鼠标右键,选择“属性”菜单,在弹出的属性对话框中“链接器-->输入-->模块定义文件”中填写刚才定义的def文件,然后再重新编译即可生成LIB文件。
2、新建->win32项目->->dll->->导出符号(这样的话vs会自动帮你生产一些文件,然后自己可以在这个的基础上修改下)
生成好了后会在相应的目录下出现lib和dll两个文件。
使用的时候把lib和dll以及h文件导出就可以了。
其它工程中使用的时候用下面两种方式:
#pragma comment (lib,"MyDLL.lib")
或者:
HINSTANCE hInstLibrary = LoadLibrary(_T("MyDLL.dll"));//注意此处必须有_T()函数。
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
cout<<"LoadLibrary error!"<<endl;
getchar();
return 0;
}
else
{
}
---------------
如果在新建dll的时候选择空白的文件(即不用vs自带的帮你生成)的话,注意一定要自己手动添加def文件。否则生成不了lib文件!
Visual C++ 开发工具提供了两个命令行工具,一个是dumpbin.exe,另一个是lib.exe。利用这两个工具即可从dll导出其对应的lib。
1、在命令行执行:
dumpbin /exports yourdll.dll > yourdll.def
2、编辑 yourdll.def 文件,使之格式与.def文件格式一致。比如:
EXPORTS;
fn1;
fn2;
3、在命令行执行:
lib /def:yourdll.def /machine:i386 /out:yourdll.lib