我试图链接一个C ++二进制文件,但我得到未定义的符号错误。 我的二进制文件不应该需要这些符号,我想了解导致链接器(GNU ld或GNU gold)的依赖链,认为它们是需要的。 有libfoo.a
包含数百个.o
文件。 我的程序在libfoo.a
调用函数。 我想得到一个依赖关系图,其中包含链接器认为需要链接我的程序的libfoo.a
中的所有.o
文件。
我需要它,因为我怀疑在libfoo.a
某个地方有一个错误,调用了不是真正需要的函数。 我可以修改libfoo.a
的源代码(从而删除不需要的调用),为此我需要了解不需要的调用的位置。 依赖图可以帮助我find它。
请注意,由于未定义的符号,没有生成可执行文件。
请注意,我的最终目标不是构build这个特定的二进制文件,而是确保在libfoo.a
中不调用不需要的函数。
我已经看过man ld
,但我找不到任何命令行标志,可以给我更详细的输出。
来自链接器的示例错误:
libfoo++.a(foo1.o):foo1.cc:function foo1f: error: undefined reference to 'bar'
我怎么知道是什么导致foo1.o
被链接到可执行文件? (对于我来说没问题,因为我不需要它,我的问题是foo1.o
是必须的,但不应该是,我想删除导致foo1.o
的调用被链接。)
我想得到一个依赖关系图,其中包含链接器认为需要链接我的程序的libfoo.a中的所有.o文件。
用-M
(或--print-map
)标志打印的链接器映射完全包含该信息。 如果使用编译器驱动程序(例如gcc
)来执行链接(您应该),则将-Wl,-M
添加到链接行。