C++ 寻找符号依赖的起源

C++ 寻找符号依赖的起源,c++,linker,C++,Linker,我正在从事一个相当大的项目,该项目有大量的外部依赖项。在开发过程中,我一直在调试构建。现在,当我尝试构建发行版时(经过很长时间),我得到一个错误,说找不到特定的符号。具体地说,在我的例子中,链接器给了我一个错误,说没有找到start\u thread\u noexceptsymbol。这个符号预计会在boost线程中找到,但当我使用nm-G-D--demangle检查boost线程的版本时,我发现确实没有找到这个符号(不过我确实找到了一个名为start\u thread的符号)。显然,noexc

我正在从事一个相当大的项目,该项目有大量的外部依赖项。在开发过程中,我一直在调试构建。现在,当我尝试构建发行版时(经过很长时间),我得到一个错误,说找不到特定的符号。具体地说,在我的例子中,链接器给了我一个错误,说没有找到
start\u thread\u noexcept
symbol。这个符号预计会在boost线程中找到,但当我使用
nm-G-D--demangle
检查boost线程的版本时,我发现确实没有找到这个符号(不过我确实找到了一个名为
start\u thread
的符号)。显然,noexcept符号可以在库的最新版本中找到


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

我转到了中间目录并执行了此操作

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

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

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