我试图在我的可执行文件中节省空间,我注意到有几个函数被添加到我的目标文件中,即使我从未调用它们(代码来自库)。
有没有办法告诉 gcc 自动删除这些功能还是我需要手动删除它们?
最佳答案
如果你编译成目标文件(不是可执行文件),那么编译器永远不会删除任何非 static
函数,因为你总是有可能将目标文件链接到另一个将调用该函数的目标文件。所以你的第一步应该是声明尽可能多的函数 static
。
其次,编译器删除任何未使用的函数的唯一方法是静态链接您的可执行文件。在这种情况下,至少有一个程序可能会出现并找出使用哪些功能以及哪些功能没有使用的可能性。
问题是,我不相信 gcc 实际上会进行这种类型的跨模块优化。你最好的选择是 -Os
标志来优化代码大小,但即便如此,如果你有一个目标文件 abc.o 有一些未使用的非静态函数并且你静态链接到一些可执行文件 def.exe,我不相信gcc 将删除未使用函数的代码。
如果您真的非常需要这样做,我认为您可能必须将文件实际 #include
放在一起,以便在预处理器通过后,编译出单个 .c 文件。通过 gcc 编译单个巨大的巨型源文件,您很有可能消除未使用的函数。
关于gcc - 有没有办法从我没有使用的目标文件中去除所有函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2634007/