我正在构建一个二进制文件,它使用多个编译为 .so 文件的组件。我收到一系列链接器错误,这些错误指向哪个 .so 文件导致了这些错误,但是我可以获得有关哪些文件正在调用未定义函数的信息,或者是否可能获取有关调用未定义函数的源代码位置的信息?我发现寻找函数 esp 太乏味了,因为使用了很多重载和模板(这意味着在很多地方都有相同的名称)。在 Windows 中,它显示哪个 .o 文件导致了 undefined symbol ,但我陷入了 Linux 中的库级别。我在linux下使用g++。任何指针都会有用。
最佳答案
您询问“共享库中的哪个对象文件导致了错误”。
问题是,当共享库被链接时,所有目标文件都已“融合在一起”,并且不再作为单独的实体存在于共享库中,因此您的问题有些毫无意义。
也就是说,如果您进行调试构建(使用 -g
标志),链接器会告诉您哪个源文件和行导致了问题,您可以然后也许能够翻译成目标文件。
如果不能(例如,因为头文件中引用了问题符号),您可以向链接器寻求帮助:再次重建库,传递链接器 -y
标志:
g++ -fPIC -shared ${OBJECTS} -o foo.so -Wl,-y,my_unresolved_symbol
会告诉您哪个对象引用了my_unresolved_symbol
。
注意:链接器在 C++ 的“下方”运行,因此您必须传递损坏的名称,例如_Znw
到它。
关于c++ - 获取导致 g++ 中链接器错误的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5307848/