【问题标题】:unresolved external symbol error. dumpbin shows extra @number appended to symbols未解决的外部符号错误。 dumpbin 显示附加到符号的额外@number
【发布时间】:2011-04-09 15:13:00
【问题描述】:

我的 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 到库的编译器选项。但我仍然遇到同样的错误。

【问题讨论】:

    标签: c visual-studio-2008 linker-errors


    【解决方案1】:

    带有@ 符号和数字的符号是使用stdcall calling convention 的函数。看来您正在使用 stdcall 作为默认值而不是 cdecl 来编译新库。

    查看函数声明的头文件。您很可能会看到一些指示此替代调用约定的内容。如果您不这样做并且您确定您拥有的静态库与头文件匹配,您可以更新头文件中的function declarations 以包含stdcall 调用约定。然后在编译使用静态库的程序时,程序中的符号将正确查找stdcall 样式的函数符号。

    解决更新

    这可能与您将静态库链接到的内容以及您将最终二进制文件链接到的内容冲突。您的静态库和最终程序二进制文件都必须链接到同一个 C 运行时。

    【讨论】:

    • 函数声明为ext_def(char *) swe_version(char *); 其中ext_def(x) 是宏#define ext_def(x) extern EXP32 x FAR PASCAL_CONV EXP16
    • 我会查看PASCAL_CONV 宏。不再支持 pascal 调用约定。尝试将FAR PASCAL_CONV 更改为WINAPIWINAPIWindows.h 中定义。
    • 旧的 PASCAL 调用约定已被 stdcall 取代。顺便说一句,这是最常见的导出 DLL 函数。
    • 你当然不应该在函数上使用“ext_def”。或者更改宏。
    • 对于一个有意义的静态库。无需导出。
    猜你喜欢
    • 2011-09-03
    • 2010-11-20
    • 2011-10-21
    • 2012-10-21
    • 1970-01-01
    • 2014-05-12
    • 2014-05-14
    • 2016-07-10
    相关资源
    最近更新 更多