c++ - 使用 GCC 编译非必要的目标文件

标签 c++ gcc linker compilation

考虑下面的例子

g++ a.o b.o c.o -o prog

如果 c.o 没有为 prog 提供任何可执行代码,也没有任何对 c.o 的依赖其他文件,GCC 是否会将 c.o 的内容包含在 prog 中?

换句话说,除了编译时间之外,将不必要的文件编译成可执行文件会有什么(如果有的话)负面后果?

提前致谢;干杯!

最佳答案

除了您的可执行文件可能过大之外,没有任何负面影响。链接器可能会为您删除未使用的代码,这会将事情缩减。您可以在输出可执行文件上使用某种对象查看工具(otoolobjdumpnm 等)来查看您的程序是否具有里面有额外的符号。

我使用的是 Mac,所以如果您使用的是标准的 gcc 工具集,会有一些差异,但这里有一个示例:

$ make
gcc -o app main.c file2.c
gcc -Wl,-dead_strip -o app_strip main.c file2.c
$ ls -l app*
-rwxr-xr-x  1 carl  staff  8744 Feb  6 20:05 app
-rwxr-xr-x  1 carl  staff  8704 Feb  6 20:05 app_strip

我认为在非 Apple gcc 世界中,您将传递 -Wl,--gc-sections 而不是我示例中的 -Wl,-dead_strip。您可以看到两个可执行文件的大小差异是由于去除了额外的功能:

$ nm app | cut -c 20- > app.txt
$ nm app_strip | cut -c 20- > app_strip.txt 
$ diff app.txt app_strip.txt 
8d7
< _function2

关于c++ - 使用 GCC 编译非必要的目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215856/

相关文章:

gcc - 编译错误gcc -lpthread位置

c++ - 无法更改 CMake 中的默认链接器

c++ - 如何打开 .a 文件

c++ - 为什么没有 static_cast 会失败?

c++ - _mm256_extractf32x4_ps 和 _mm256_extractf128_ps 之间的区别

c++ - FFmpeg:无法设置/获取/查找 HLS 选项

c++ - 为什么tellg()在代码末尾返回-1?

c - RV32E 版本的软浮点方法,例如 __divdi3 和 __mulsi3

c++ - BOOST & GCC,未定义的 boost 引用

c++ - g++ 无法链接 curl lib 文件