【问题标题】:Unresolved External Symbol [duplicate]未解析的外部符号 [重复]
【发布时间】:2010-11-12 08:08:18
【问题描述】:

可能重复:
What is an undefined reference/unresolved external symbol error and how do I fix it?

我正在努力将大量 .h 和 .lib 文件从原生 C++ 包装到托管 C++ 以最终用作 C# 中的引用 .dll。

我已经链接了 .lib 文件,到目前为止一切进展顺利。打包最新的 .h 文件后,当 2 个函数返回链接错误时,我遇到了障碍:

error LNK2019: unresolved external symbol __imp__htonl@4 referenced in function
"public: void __thiscall Field::setCharacter(unsigned char,int)"
(?setCharacter@Field@@QAEXEH@Z) myutils.lib 

我在链接器选项中引用了myutils.lib,所以这不应该是问题。

奇怪的是,我在这个特定的 .h 文件中有大约 20 个函数,其余的都链接得很好,除了 3 个函数。

有什么想法吗?

【问题讨论】:

  • 您能否发布未链接的函数的代码(可能是用于比较的函数之一)?
  • "...所以这不应该是问题。" -> “应该”在大多数情况下是一个非常危险的词;)

标签: c++ linker unresolved-external


【解决方案1】:

缺少的符号是__imp__htonl@4,它是 htonl 的 C++ 错位名称,它是将 long 值从主机转换为网络顺序的函数。 @4 用于修改输入参数,并且是 C++ 支持重载函数的一部分,以允许链接器解决正确的函数而不会出现名称冲突。

确保您已链接到引用此符号的网络库。大概你的包使用了这个符号的一些特殊定义,而不是通常的 MACRO。

【讨论】:

  • 谢谢克里斯托弗。仔细观察, __imp__htonl 是机器上已经存在的库的一部分。我简单地在包装头中添加了:“#pragma comment(lib, "Ws2_32.lib")" 并且它可以工作!
【解决方案2】:

您确定签名匹配吗?一定要检查签名和常量。另外,请确保函数没有内联。

【讨论】:

  • 来自 .h 文件: void setCharacter( unsigned char c, int startBit );从包装: void setCharacter( unsigned char c, int startBit ) { m_NativeField->setCharacter(c, startBit); };据我了解,这些函数应该在我引用的 lib 文件中完全定义。如果这也有帮助,我可以提供符号导出。有谁知道如何破译链接器输出的代码......即,“__imp__htonl@4”等是什么意思?
  • 这三个函数不都是单行导出的吗?它们是唯一的短函数吗?
【解决方案3】:

我在针对库进行编译时遇到了这个错误,然后在链接之前更改了库。确保您的标头与您的库提供的标头相同(不是从其他架构复制等)。当然,请确保您链接到 ws2_32.lib(-lws2_32 用于 mingw/gcc)。

另外,如果你使用的是 GCC/mingw,你可能想看看这个:MinGW linker error: winsock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多