提问人:TomO 提问时间:7/20/2009 最后编辑:CommunityTomO 更新时间:4/26/2016 访问量:17496
未解析的外部符号 [重复]
Unresolved External Symbol [duplicate]
问:
我正在努力将大量 .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 个函数外,其余所有函数都链接得很好。
有什么想法吗?
答:
1赞
eduffy
7/20/2009
#1
您确定签名匹配吗?请务必检查符号和恒定性。此外,请确保函数未内联。
评论
0赞
TomO
7/20/2009
从 .h 文件: void setCharacter( unsigned char c, int startBit );从包装器: void setCharacter( unsigned char c, int startBit ) { m_NativeField->setCharacter(c, startBit);根据我的理解,这些函数应该在我引用的 lib 文件中完全定义。如果这也有帮助,我可以提供符号导出。有谁知道如何破译链接器输出的代码......即,“__imp__htonl@4”等是什么意思?
0赞
eduffy
7/20/2009
未导出的三个函数是否都像那个函数一样是单行函数?它们是唯一的短函数吗?
6赞
Christopher
7/20/2009
#2
缺少的符号是 ,这是 htonl 的 C++ 错误名称,这是一个将长值从主机转换为网络顺序的函数。@4 用于修改输入参数,并且是 C++ 对重载函数支持的一部分,以允许链接器在没有名称冲突的情况下解析正确的函数。__imp__htonl@4
确保您已链接到引用此符号的网络库。据推测,您的软件包正在使用此符号的一些特殊定义,而不是通常的 MACRO。
评论
11赞
TomO
7/20/2009
谢谢克里斯托弗。仔细观察,__imp__htonl是机器上已有的库的一部分。我简单地添加了:“#pragma comment(lib, ”Ws2_32.lib“)”到包装器标题中,它可以工作!
1赞
wickedchicken
5/20/2010
#3
当我针对库进行编译然后在链接之前更改库时,我遇到了此错误。确保你的头文件与你的库提供的头文件相同(不是从其他架构复制的,等等)。当然,请确保你链接到 ws2_32.lib(mingw/gcc 为 -lws2_32)。
此外,如果您使用的是 GCC/mingw,您可能需要查看以下内容: MinGW 链接器错误:winsock
上一个:对未解析的外部符号错误感到困惑
下一个:共享库中的静态类成员
评论