【问题标题】:Finding Origin of Symbol Dependency寻找符号依赖的起源
【发布时间】:2014-04-22 05:13:28
【问题描述】:

我正在从事一个相当大的项目,该项目具有大量外部依赖项。我在开发期间一直致力于调试构建。现在,当我尝试构建版本时(经过很长时间),我收到一条错误消息,指出未找到特定符号。特别是在我的情况下,链接器给我一个错误,说找不到start_thread_noexcept 符号。这个符号预计会在 boost-thread 中找到,但是当我检查我使用 nm -G -D --demangle 的 boost-thread 版本时,我发现确实找不到这个符号(我确实找到了一个名为 start_thread 的符号)。显然,noexcept 符号可以在该库的更新版本中找到。

然而,我的问题更为笼统。我现在要做的是找到这个符号要求的起源。我猜我一定有一些新的函数调用,它反过来又调用了start_thread_noexcept 函数。显然,在编译我的代码时必须生成一个.o 文件,我可以将此要求追溯到。要么,要么我添加了一些新的第三方依赖项,而这又需要新版本的 boost-thread 库。如何找到需要这个未定义符号的代码/库?

【问题讨论】:

  • 您可以从枚举您的对象和外部依赖项开始,然后依次在每个对象上运行nm --demangle | grep mysterysymbol
  • 链接器还应该打印请求未解析符号的目标文件(参见例如this nifty example)。什么是链接器错误信息?

标签: c++ linker


【解决方案1】:

我去了中间目录,做了

for x in *.o; do echo $x; nm $x | grep "_ZN5boostlsIcSt11"; done

这让我能够追踪编译单元,进而让我能够(手动)找到有问题的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多