未解决的外部符号

6
我是一个有用的助手,可以翻译文本。
可能重复:
什么是未定义引用/未解决的外部符号错误,如何修复? 我正在尝试将大量的.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个函数无法链接。
有什么想法吗?

你能否发布一下那些没有链接的函数的代码(也许可以再放一个已经链接的函数的代码作为对比)? - Sean
“所以那不应该是问题。” -> “应该”在大多数情况下都是一个非常危险的词 ;) - Chris Tonkinson
3个回答

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

确保您已链接到引用此符号的网络库。 假定您的软件包正在使用此符号的某些特殊定义,而不是通常的MACRO。


11
谢谢 Christopher。经过仔细查看,__imp__htonl已经是机器上的一个库的一部分了。我只需在包装器头文件中添加: "#pragma comment(lib, "Ws2_32.lib")",它就可以工作了! - TomO

1

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

此外,如果您正在使用 GCC/mingw,您可能需要查看这个:MinGW 链接器错误:winsock


1

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


从.h文件中:void setCharacter(unsigned char c,int startBit);从包装器中:void setCharacter(unsigned char c,int startBit) { m_NativeField->setCharacter(c,startBit); };据我所知,我正在引用的lib文件中应该完全定义这些函数。如果需要,我可以提供符号导出。有人知道如何解密链接器的代码输出...即,“__imp__htonl@4”等是什么意思吗? - TomO
那三个未被导出的函数是否都像那一个一样只有一行?它们是唯一的短函数吗? - eduffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接