我的知识是C非常有限。我正在尝试升级我的项目中使用的库。我用更新的文件替换了旧的静态库和头文件。当我尝试构建我的项目时,我收到“未解析的外部符号”错误。
我使用dumpbin检查了旧的和新的lib文件,发现新库中的符号有一个额外的@number(其中number是8,16,24,28,32,40,48,52之一,附上72或80)。有人可以告诉我如何继续吗?
更新
错误以某种方式停止。但现在我收到了错误
LIBCMT.lib(tidtable.obj):错误LNK2005:__encode_pointer已在MSVCRT.lib中定义(MSVCR90.dll)
我tried adding /NODEFAULTLIB:LIBCMT.lib
到库的编译器选项。但我仍然得到同样的错误。
答案 0 :(得分:2)
附有@
符号和数字的符号是使用stdcall
calling convention的函数。您似乎正在使用stdcall
作为默认值而不是cdecl
来编译新库。
查看函数声明中的头文件。您很可能会看到指示此备用调用约定的内容。如果不这样,并且您确定您的静态库与头文件匹配,则可以更新头文件中的function declarations以包含stdcall
调用约定。然后在编译使用静态库的程序时,程序中的符号将正确查找stdcall
样式函数符号。
解决更新
这可能与您将静态库链接到的内容以及将最终二进制文件链接到的内容发生冲突。静态库和最终的程序二进制文件都必须链接到相同的C运行时。