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

DVK*_*DVK 20 c++ gcc build include

我有一个我继承的C++应用程序,它包括:

  • 我的主要应用
  • 几个特定于应用程序的库(libapp1,libapp2等...)
  • 几个"第三方"库(大多数"第三方只是公司中的其他团队")从主应用程序,特定于应用程序的libappX库以及其他第三方库(例如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>
Run Code Online (Sandbox Code Playgroud)

问题:

1)如何判断哪些库已链接到最终可执行文件?这必须包括静态链接的

换句话说,我想要一个"app1,app2,ext1,ext2,ext3,ext4"的答案

理想情况下,答案可以从可执行文件本身获得(我已经构建了它的调试版本以防止它变得更加可能).如果这是不可能的,我想知道是否有一个简单的代码分析工具(即gcc本身内部的某些东西)来提供该分析.

请注意,已经构建了外部库的目标文件,因此查看构建日志以查看链接的内容,我担心"ext4"不会显示在日志中,因为我们不会构建"ext3" "已经预建的图书馆.

注意:运行"nmake"并将DEPS设置为yes以重建所有不是一个选项.但我可以访问外部库的完整源代码.

2)一个稍微单独且不太重要的问题,我如何告诉我正在构建的整个源代码树中使用的所有包含文件的列表.再次,理想情况下frm已经构建的可执行文件,我有一个调试版本.

=================

更新:为了澄清,我们的库是静态链接的,因此ldd(List Synamic Dependencies)不起作用.

此外,答案可以是Solaris或Linux - 无关紧要.

我试过使用nm但没有列出库

Dan*_*ski 30

我有类似的问题,并找到了解决方案:链接时添加-Wl, - 详细选项.它会将链接器切换到详细模式:

gcc -o test main.o -ltest -L. -Wl,--verbose
Run Code Online (Sandbox Code Playgroud)

这是示例输出:

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
Run Code Online (Sandbox Code Playgroud)

更新: 您还可以使用-Wl, - trace选项代替-Wl, - verbose.它还会为您提供库列表,但不太详细.

更新2: -Wl, - trace不显示间接包含的库.示例:您与libA链接,并且libA与libB链接.如果你想看到也需要libB,你必须使用-Wl, - verbose.

  • 作为关注者的注意事项,库的“.o”文件`ld`列表(即在它说`尝试打开libXX成功`之后列出的那些)不会是库中的“所有”.o文件,只有它需要满足那时的依赖关系。其余的基本上都被丢弃了,即使存在于 .a 文件中。参考:http://stackoverflow.com/q/14091669/32453 (2认同)

ism*_*ail 10

对于直接依赖;

ldd <app>
Run Code Online (Sandbox Code Playgroud)

间接/所有依赖;

ldd -r <app>
Run Code Online (Sandbox Code Playgroud)