如果你用 GCC 编译一个共享库并传递“-z defs”标志(我认为它只是盲目地传递给 ld),那么你会得到一个很好的报告,说明哪些符号未定义,并且 ld 失败(没有 .so 文件)被建造)。另一方面,如果您不指定“-z defs”或显式指定“-z nodefs”(默认值),那么即使缺少符号,也会生成 .so,但您不会得到有关哪些符号的报告如果有的话失踪了。
我两个都想要!我希望创建 .so,但我也希望报告任何丢失的符号。到目前为止,我知道执行此操作的唯一方法是运行它两次,一次使用“-z defs”,一次不使用。这意味着可能很长的链接阶段会完成两次,这将使编译/测试周期变得更糟。
如果您想知道我的最终目标 - 编译库时,本地对象文件中未定义的符号表示未指定应该在我的构建环境中的依赖项,而如果您的库中缺少符号链接不是一个错误(-l 标志仅针对直接依赖项给出,而不是在此系统下的依赖项的依赖项)。我需要列出“文件中引用”部分的报告,以便我可以查看该符号是否被本地对象或正在链接的库引用。 --allow-shlib-undefined 选项几乎解决了这个问题,但在链接静态库时它不起作用。
优先选择可与 GNU 和 Solaris 链接器一起使用的解决方案。
您可以在生成的 .so 文件上使用 nm,而不是让 ld 在链接期间报告未定义的符号。例如:
nm --dynamic --undefined-only foo.so
编辑:虽然我想这并没有告诉你符号在哪些源文件中使用。抱歉,我错过了你问题的这一部分。
您仍然可以使用 nm 以及 grep 来获得近似解:
for sym in `nm --dynamic --undefined-only foo.so |cut -d' ' -f11 |c++filt -p` ; do
grep -o -e "\\<$sym\\>" *.cpp *.c *.h
done
这可能会对同名的本地符号等产生问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)