2011-04-08 70 views
3

我正在使用apple gcc来编译我要重新分发的dylib。出于各种原因,我使用一些库,让我们说libz保持简单。避免在链接到静态库时链接到未使用的符号

由于这个库通常不在Mac系统上,我希望static link in通过将路径传递到.a-file来简化部署,将符号用到dylib中。

现在,链接器链接所有符号从lib到生成的dylib,虽然我只引用一个子集。在linux上,我从来没有遇到过这个问题,链接器高兴地丢弃所有未引用的符号并创建一个非常纤细的可执行文件,所以它应该是可能的。我现在拥有的dylib文件比它应该大10倍。

我试着用-dead_code连接器标志摆弄,但无济于事。也许我只是不明白吗?

有没有人知道这个解决方案?

回答

5

Try -Wl,--gc-sections

至于-dead_strip(你可能是-dead_code的意思):

之前接通-dead_strip 选择你的项目必须首先 被“移植”的死码 剥离工作。这将包括将 从-gused(默认为-g)更改为 -gfull,并使用来自 Mac OS X 2004年6月发行版的新编译器将所链接的所有对象文件重新编译为您的 程序。此外,如果 建筑物加载 插件的可执行文件,它使用的符号从 可执行文件,你将不得不使用 属性,确保 的插件使用不 剥离(符号((使用))或-exported_symbols_list选项)。如果您正在使用导出列表并构建将与ld(1)的 -bundle_loader标志一起使用的共享库或可执行文件 ,则需要在导出列表中包含例外 帧信息的符号 为您导出的C++符号。这些 符号以.eh结尾,用nm(1)工具可以看到 。

and

要启用死代码从 命令行汽提,通过-dead_strip 选项到ld。您还应该将 -gfull选项传递给GCC,以便为您的代码生成一组完整的调试符号。链接器使用这个额外的 调试信息来死掉 的可执行文件。

希望这会有所帮助。

此答案中的所有内容都位于“apple ld static link unused symbols”的前几个Google搜索结果中。 :)

+0

感谢您的谷歌这一点。在mac上进行编译与'ELF'相对的'Mach-O'对象与' - gc-sections'开关一起使用。我试着'-gfull'开关和'-dead_strip'一起使用,但无济于事。 – vidstige 2011-04-09 16:40:44