首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

LNK2001异常, 高手能看看

2012-09-10 
LNK2001错误, 高手能看看?使用动态联结库出现了LNK2001错误联结库的头文件以及lib均设置但是发现调用一个

LNK2001错误, 高手能看看?
使用动态联结库出现了LNK2001错误
联结库的头文件以及lib均设置

但是发现调用一个函数PROTOCOL_INIT时候出现LNK2001, 
头文件中这个函数定义是
#if defined (CPROT)
void PROTOCOL_INIT();
#endif


而我程序中的确定义了CPROT
但是仍然出现LNK2001
但是如果我调用#if #endif外的函数,比如函数FACILITY_RESP
头文件中这个函数FACILITY_RESP定义是
#if defined (CPROT)
...
#endif
void FACILITY_RESP();
却没有问题

还有一个问题通过depends来看这个DLL库,却发现不了PROTOCOL_INIT或FACILITY_RESP,但是FACILITY_RESP的确可以调用

高手能看看?




[解决办法]
LNK2001是未解决的符号,也就是说函数只有声明没有实现。
PROTOCOL_INIT和FACILITY_RESP都没有__declspec(dllimport),这两个函数应该都不是从dll导入的,dll没导出这两个函数也不奇怪。
不过它们可能会是从lib导入(这个lib可能经过一些特定处理),lib文件结构既可以包含动态库的链接信息也可以包含一些函数体(类似于静态库),但是这个lib可能只有FACILITY_RESP的函数定义,却没有PROTOCOL_INIT的定义。
这是死结,也就是dll和lib本身就没有把PROTOCOL_INIT包含进来,即便是你定义了CPROT也没有用。如果你有dll的源码,可以在源码里面定义一下CPROT,重新编译,这样才能把PROTOCOL_INIT包含进来。虽然你可以自己定义一个PROTOCOL_INIT函数体,来使得链接通过,不过意义不大,除非你知道PROTOCOL_INIT的代码。

[解决办法]
http://blog.csdn.net/happyparrot/archive/2008/03/20/2200072.aspx
[解决办法]
编译DLL的时候CPROT没定义
[解决办法]
声明CPROT的位置
[解决办法]
直接在工程中声明CPROT,如果还不行,那有可能是在生成DELL的时候没有定义CPROT或者在DEF文件中没有导出这个函数

热点排行