使用动态联结库出现了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的确可以调用高手能看看?
联结库的头文件以及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的确可以调用高手能看看?
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的代码。