考虑下面的例子
g++ a.o b.o c.o -o prog
如果 c.o
没有为 prog
提供任何可执行代码,也没有任何对 c.o
的依赖其他文件,GCC 是否会将 c.o
的内容包含在 prog
中?
换句话说,除了编译时间之外,将不必要的文件编译成可执行文件会有什么(如果有的话)负面后果?
提前致谢;干杯!
最佳答案
除了您的可执行文件可能过大之外,没有任何负面影响。链接器可能会为您删除未使用的代码,这会将事情缩减。您可以在输出可执行文件上使用某种对象查看工具(otool
、objdump
、nm
等)来查看您的程序是否具有里面有额外的符号。
我使用的是 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/