考虑以下命令:
g++ -Wl,--start-group main.o liba.a -Wl,--end-group -o a.out
是否有可能在 a.out 中有一些在 liba.a 中定义但 main.o 没有使用的符号?如果是,在什么情况下?在编写源代码或调用编译器或链接器时是否有一些技巧来实现这一点?据我所知,这不应该发生,但我最近确实遇到了这样的情况。
我可以想到至少三种可能发生这种情况的情况:
-Wl,--whole-archive
可用于强制liba.a
包含整个文件,而不仅仅是所需的目标文件。liba.a
可能包含 C 运行时使用的符号,绕过main.o
. 此类符号的最常见原因是具有构造函数的 C++ 全局或文件范围对象。liba.a
给-ffunction-sections -fdata-sections
出来解决这个问题。-Wl,--gc-sections
对于最近的 GCC(我不会尝试使用早于 4.7 的任何东西),编译所有内容然后-flto
链接到-fwhole-program
也可能会有所帮助。