VC引入lib库并解决连接错误unresolved external symbol "__declspec(dllimport) const DllClass::`vftable'" (__imp_?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010459100/article/details/50537262

VC中引入lib库:

链接库分为静态链接库和动态链接库,静态链接库只有一个.lib文件,而动态链接库则有一个.lib文件和.dll文件;静态链接库的.lib文件里面有函数真正实现的机器码,而动态链接库的.lib只有函数的符号名,真正的函数的实现在dll文件中。

当你使用静态库或者使用隐式的方式加载动态连接库的话,都需要将.lib文件加到vc工程里面去,他们的区别就在于,使用动态库的话,在运行程序时,需要额外将函数真正实现的dll文件放到程序的运行目录下或者程序默认的搜索路径下,而静态库则只要引入.lib文件后,就可以调用库中的函数。

在vc环境下将lib库引入工程,有下面3种方法:

第一种方法,lib文件直接加入到工程文件列表中。

在VC中打开“File View”一页,选中工程名,单击鼠标右键,然后在弹出的快捷菜单中选择【Add Files to Project】命令,在弹出的文件对话框中选中要加入dll的lib文件即可。


第二种方法,设置工程的【Project】菜单【Settings】来加载dll的lib文件

打开工程的【Project】菜单的【Settings】,选中【Link】,然后在“Object/library modules”下的文本框中输入dll的lib文件。

第三种方法,预编译指令导入

加入预编译指令#pragma comment(lib,”*.lib”),这种方法优点是可以利用条件预编译指令链接不同版本的lib文件。因为,在Debug方式下,产生的lib文件是Debug版本,如Regd.lib;在Release方式下,产生的lib文件时Release版本,如Regr.lib。

当然,在引入.lib文件后,工作并没有完成,为了解决编译问题,我们还需要将连接库中函数的对应的头文件(*.h)包含到其中,在这个头文件中给出了链接库中定义的函数原型。在编译完成后,连接器会去.lib文件中去查找函数的符号表,找到后,编译和连接工作就完成了;在运行的时候,再去dll文件中去找函数的真正实现(如果是静态库则直接在.lib文件中寻找函数的真正实现。)

转自:http://www.cnblogs.com/RascallySnake/archive/2012/10/17/2728557.html

解决VC6.0中的连接错误:

在涉及到进程信息获取部分中,需要使用Psapi.lib和psapi.h,在VC6.0中并不包含该类库,需要额外下载,将Psapi.lib放入VC安装目录下的LIB,将psapi.h放入INCLUDE,Psapi.dll一般系统自带,位于System32目录下。

在这里实现的是将dll注入到一个进程的地址空间,在VC6.0中需要自己设置一些选项,添加lib等链接库,程序才能正常编译生成。

添加链接库利用上述提到的方法即可,在连接中还是产生了如下错误:

unresolved external symbol "__declspec(dllimport) const DllClass::`vftable'" (__imp_??_7DllClass@@6B@)

这里的解决方法是没有将头文件中的预处理定义加入设置,

在VC工程的工程->设置->C/C++->预处理程序定义中添加BUILDING_DLL即可。

错误原因详细分析:点击打开链接

参考:http://blog.chinaunix.net/uid-25958655-id-4194184.html



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页