在UNIX上工作的大多数人经常会遇到这种恼人的错误。 有时候解决的时间会少一些,有时需要花费很多时间。
即使我经常面对这个问题,我需要一些好的文件或关于c / c ++中特定错误的文章
可能存在符号未找到/未定义符号错误的所有情况。
有人能帮助我知道这些情况是什么吗?
答案 0 :(得分:3)
该错误与UNIX / Windows /任何其他操作系统无关,而是与语言本身有关。使用编译器提供的信息进行诊断实际上相当简单。通常他们会告诉你缺少什么符号以及有时使用它的地方。缺少符号的主要原因是:
如果您打算来定义符号但与声明(声明为void foo( int, double );
但未定义void foo( double, int )
)匹配,则第一个有点棘手。与其他所有符号一样在这种情况下,编译器会告诉你它正在寻找的确切签名,确保你已经定义了那个符号,而不是那些接近或类似的东西,如果你使用不同的特殊角落情况在声明和定义中调用约定,因为它们在代码中看起来非常相似。
在库外部代码的情况下,复杂性在于识别需要链接的库以便添加该符号,并且来自lib的文档。请注意,对于静态库,链接器命令行中lib的顺序会影响结果。
为了帮助您找到实际定义的符号,您可以使用nm
(gcc,这在unix系统中很常见)。所以基本上你可以针对你链接的目标文件/ lib运行nm
并搜索链接器抱怨的符号。这将有助于在顺序产生差异的情况下(即符号在那里,但链接器跳过它)。
在运行时(感谢Matthieu M.指出它)你可能会遇到与动态库类似的问题,如果在LD_LIBRARY_PATH中找到了错误的库版本,你可能会得到一个没有必需的库符号
答案 1 :(得分:2)
虽然它们可以依赖于平台,但我对安德烈亚斯和大卫的一些观点有一些“更复杂”的例子:
答案 2 :(得分:1)
对于大多数情况,当您获得符号未找到/未定义符号或有时甚至是“重复符号”错误时,它们通常源于链接器无法在您尝试构建的项目中找到该符号的事实
最好的方法是查看生成的映射文件或作为编译器输出的符号表。它可能看起来像这样:
这将允许您查看符号是否存在。此外,可能还有其他深奥的问题,例如编译器优化可能导致符号重复,尤其是内联汇编。这些是最难检测到的。
至于良好的资源和材料,我没有很多好的参考资料。当我当时回答问题时,大多数高级工程师实际上已经从他们自己的经验中学习。
但我确信这些论坛的存在可以帮助我们加快这种知识的获取。
希望它有所帮助:)
干杯!
答案 3 :(得分:1)
我假设您指的是链接器错误。这是我最喜欢的一个列表: