【问题标题】:Get the file causing linker error in g++在g ++中获取导致链接器错误的文件
【发布时间】:2011-03-15 05:28:04
【问题描述】:

我正在构建一个使用多个组件的二进制文件,这些组件被编译为 .so 文件。我收到了一系列链接器错误,这些错误指向哪个 .so 文件导致了它们,但是我可以获得有关哪些文件正在调用未定义函数的信息,或者是否可以获取正在调用未定义函数的源代码位置?我发现寻找函数 esp 太乏味了,因为正在使用大量重载和模板(这意味着在许多地方都使用相同的名称)。在 Windows 中,它显示了哪个 .o 文件导致了未定义的符号,但我停留在 linux 中的库级别。我在 linux 中使用 g++。任何指针都会很有用。

【问题讨论】:

  • 为什么不跳过库步骤?与其将对象组合到库中并动态加载它们,不如将对象直接链接到二进制文件中。

标签: c++ linker g++


【解决方案1】:

您在问“共享库中的哪个目标文件导致了错误”。

问题是,当共享库被链接时,所有对象文件都已经“融合在一起”,不再作为单独的实体存在于共享库中,所以你的问题有点毫无意义。

也就是说,如果您进行调试构建(使用 -g 标志),链接器会告诉您哪个 source 文件和行导致了问题,然后您可以翻译到目标文件中。

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

g++ -fPIC -shared ${OBJECTS} -o foo.so -Wl,-y,my_unresolved_symbol

会告诉你哪些对象引用了my_unresolved_symbol

注意:链接器在“低于”C++ 下运行,因此您必须传递损坏的名称,例如_Znw 给它。

【讨论】:

  • 感谢您提供的信息,它非常有用。我还设法调整构建系统以生成静态库而不是动态库,现在 gcc 提供了我想要的信息。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,但我已经从错误消息中知道是哪个文件导致了错误。我想知道它里面的哪个目标文件使用了未定义的函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多