我有一个我继承的 C++ 应用程序,其中包括:
- 我的主应用
- 几个特定于应用的库(libapp1、libapp2 等...)
- 几个“第三方”库(大多数“第三方只是公司中的其他团队”)从主应用、特定于应用的 libappX 库和其他第 3 部分库(例如libext1、libext2 等...
换句话说,我的代码如下所示:
// main.C
#include <app1/a1l1.H>
#include <app2/a2l1.H>
#include <ext1/e1l1.H>
// app1/a1l1.H
#include <app1/a1l2.H>
#include <ext2/e2l1.H>
// app2/a2l1.H
#include <ext2/e2l2.H>
// ext1/e1l1.H
#include <ext3/e3l1.H>
// ext3/e3l1.H
#include <ext4/e4l1.H>
问题:
1) 我如何知道哪些库已链接到最终的可执行文件中? 这必须包括静态链接的
也就是说,我想要“app1, app2, ext1, ext2, ext3, ext4”的答案
理想情况下,答案可以从可执行文件本身获得(我有一个内置的调试版本,以防它变得更有可能)。如果这是不可能的,我想知道是否有一个简单的代码分析工具(例如 gcc 本身的东西)来提供分析。
请注意,外部库的目标文件已经构建,因此查看构建日志以查看链接的内容,我担心“ext4”不会出现在日志中,因为我们不会构建已经预先构建的“ext3”库。
注意:在 DEPS 设置为 yes 的情况下运行“nmake”来重建所有这些不是一个选项。但我确实可以访问外部库的完整源代码。
2) 一个稍微独立且不太重要的问题,我如何才能列出我正在构建的整个源代码树中使用的所有 包含文件 的列表。同样,理想情况下是 frm 已经构建的可执行文件,我有一个调试版本。
==================
更新:澄清一下,我们的库是静态链接的,所以 ldd
(列出同步依赖项)不起作用。
另外,答案可以是 Solaris 或 Linux - 没关系。
我尝试使用 nm
但没有列出库
最佳答案
我遇到了类似的问题并找到了解决方案:链接时添加 -Wl,--verbose 选项。它会将链接器切换到详细模式:
gcc -o test main.o -ltest -L. -Wl,--verbose
这是示例输出:
GNU ld (GNU Binutils) 2.23.52.20130604
Supported emulations:
i386pep
i386pe
using internal linker script:
==================================================
/* Default linker script, for normal executables */
[many lines here]
==================================================
attempt to open /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../lib/crt0.o succeeded
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../lib/crt0.o
attempt to open /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/crtbegin.o succeeded
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/crtbegin.o
attempt to open main.o succeeded
main.o
attempt to open ./libtest.dll.a failed
attempt to open ./test.dll.a failed
attempt to open ./libtest.a succeeded
(./libtest.a)test.o
[more lines here]
attempt to open /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/crtend.o succeeded
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/crtend.o
更新:您还可以使用 -Wl,--trace 选项代替 -Wl,--verbose。它还会为您提供库列表,但不那么冗长。
更新 2: -Wl,--trace 不显示间接包含的库。示例:您与 libA 链接,而 libA 与 libB 链接。如果你想看到也需要 libB,你必须使用 -Wl,--verbose。
关于c++ - 在构建我的 C++ 可执行文件 (gcc) 时,我可以获得所有链接库的报告吗? (包括静态链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4925012/