c++ - 在构建我的 C++ 可执行文件 (gcc) 时,我可以获得所有链接库的报告吗? (包括静态链接)

标签 c++ gcc build include

我有一个我继承的 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/

相关文章:

c - 我应该使用哪些 gcc 优化标志?

java - AndroidStudio : Gradle build failed for task 'app:preDexDebug (ProcessException, ExecException,非零退出值1)

azure - 是否可以将构建工件从管道复制到存储库中

java - 不同的 Spring 配置文件适用于不同的构建

c++11 for each on 2D std::vector C 不工作?

c++ - 我如何说服 MFC 的 CScrollView 按整行滚动,而不仅仅是按像素滚动?

c++ - 是否可以使用类对象作为值?

c - 尝试通过 bash 脚本中的命令行传递预处理器指令

python - 无法在 ubuntu 上正确 pip install tsne?

c++ - 在特殊情况函数中展开 for 循环