请考虑以下命令:
g++ -Wl,--start-group main.o liba.a -Wl,--end-group -o a.out
是否有可能在a.out中有一些符号在liba.a中定义但main.o没有使用?如果是,在什么情况下?在编写源代码或调用编译器或链接器以实现这一点时是否有一些技巧?根据我的知识,这不应该发生,但我最近遇到了类似的情况。
答案 0 :(得分:2)
我至少可以想到可能发生这种情况的三种情况:
-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
进行链接也可能有所帮助。