VS生成DLL没有生成LIB文件的解决方法

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



猜你喜欢

转载自blog.csdn.net/HelloEarth_/article/details/79723851