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

解决方案 »

  1.   

    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的代码。
      

  2.   

    http://blog.csdn.net/happyparrot/archive/2008/03/20/2200072.aspx
      

  3.   

    直接在工程中声明CPROT,如果还不行,那有可能是在生成DELL的时候没有定义CPROT或者在DEF文件中没有导出这个函数