C++ 在g+;中获取导致链接器错误的文件+;

C++ 在g+;中获取导致链接器错误的文件+;,c++,linker,g++,C++,Linker,G++,我正在构建一个二进制文件,它使用多个编译为.so文件的组件。我收到了一系列链接器错误,这些错误指向哪个.so文件导致了这些错误,但我能否获得有关哪些文件正在调用未定义函数的信息,或者如果可能的话,关于调用未定义函数的源代码位置的信息?我发现搜索函数esp太单调了,因为使用了很多重载和模板(在很多地方都是相同的名称)。在windows中,它显示了哪个.o文件导致了未定义的符号,但我仍然停留在linux中的库级别。我在linux中使用g++。任何指针都很有用。使用(打印共享库依赖项),您可以检查so

我正在构建一个二进制文件,它使用多个编译为.so文件的组件。我收到了一系列链接器错误,这些错误指向哪个.so文件导致了这些错误,但我能否获得有关哪些文件正在调用未定义函数的信息,或者如果可能的话,关于调用未定义函数的源代码位置的信息?我发现搜索函数esp太单调了,因为使用了很多重载和模板(在很多地方都是相同的名称)。在windows中,它显示了哪个.o文件导致了未定义的符号,但我仍然停留在linux中的库级别。我在linux中使用g++。任何指针都很有用。

使用(打印共享库依赖项),您可以检查so的依赖项以及它们是否已解决

通过使用,您可以获得在*.so文件中使用或定义的符号列表,只要它们没有被剥离。已使用的符号至少应保留,以便您可以检查是否有一些未解析的符号。

您询问的是“共享库中的哪个对象文件导致了错误”

问题是,在链接共享库时,所有对象文件都已“融合在一起”,并且不再作为单独的实体存在于共享库中,因此您的问题有些毫无意义

也就是说,如果您进行调试构建(使用
-g
标志),链接器将告诉您是哪个源文件和行导致了问题,然后您可以将其转换为目标文件

如果不能(例如,由于头文件中引用了问题符号),可以向链接器寻求帮助:再次重建库,传递链接器
-y
标志:

g++ -fPIC -shared ${OBJECTS} -o foo.so -Wl,-y,my_unresolved_symbol
将告诉您哪些对象引用了
my\u unresolved\u symbol


注意:链接器在“C++”下操作,所以必须将被损坏的名称传递给它,例如代码>“ZNW < /代码>”。不要将对象组合到库中并动态加载它们,而是将对象直接链接到二进制文件中。谢谢,但是我已经从错误消息中知道是哪个so文件导致了错误。我想知道它里面的哪个对象文件使用了未定义的函数谢谢你提供的信息,它非常有用。我还设法调整了构建系统以生成静态库而不是动态库,现在gcc提供了我想要的信息。