C++ 在链接静态库时,避免链接未使用的符号

C++ 在链接静态库时,避免链接未使用的符号,c++,linker,darwin,C++,Linker,Darwin,我正在使用编译一个动态库,我将重新发布它。出于各种原因,我使用了一些库,比如说libz,以保持简单 由于该库通常在Mac系统上找不到,因此我希望通过将路径传递到.a-file来将符号用于动态库,以简化部署 现在,链接器将库中的所有符号链接到生成的动态库中,尽管我只引用了一个子集。在linux上,我从未遇到过这个问题,链接器愉快地丢弃了所有未引用的符号,并创建了一个非常瘦的可执行文件,所以这应该是可能的。我现在拥有的动态库文件比它应该的大约10倍 我尝试过摆弄-dead_代码链接器标志,但没有用。

我正在使用编译一个动态库,我将重新发布它。出于各种原因,我使用了一些库,比如说
libz
,以保持简单

由于该库通常在Mac系统上找不到,因此我希望通过将路径传递到
.a-file
来将符号用于动态库,以简化部署

现在,链接器将库中的所有符号链接到生成的动态库中,尽管我只引用了一个子集。在linux上,我从未遇到过这个问题,链接器愉快地丢弃了所有未引用的符号,并创建了一个非常瘦的可执行文件,所以这应该是可能的。我现在拥有的动态库文件比它应该的大约10倍

我尝试过摆弄-dead_代码链接器标志,但没有用。也许我就是不明白

有人知道这个问题的解决方法吗?

关于(你可能指的是
-dead\u code
):

在打开-dead_strip之前 选项您的项目将首先必须 被“移植”以使用死代码 剥离。这将包括改变 from-gused(默认为-g)到 -gfull并重新编译链接到您的 使用来自的新编译器进行编程 MacOSX 2004年6月发布。如果 构建一个可执行文件来加载 插件,它使用来自 可执行文件,您必须确保 插件使用的符号不是 (通过使用)剥离 属性((已使用))或-exported\u symbols\u list选项)。如果您使用的是导出列表和建筑 共享库或可执行文件 将与ld(1)一起使用的 -bundle_loader标志,您需要包含异常的符号 导出列表中的帧信息 用于导出的C++符号。这些 符号以.eh结尾,可见 使用nm(1)工具

:

要从中启用死代码剥离,请执行以下操作: 命令行,传递-dead_strip 选择ld。你也应该通过考试 -gfull选项到GCC,以生成一组完整的调试符号 你的密码。链接器使用这个额外的 调试信息到死区 可执行文件

希望这有帮助


此答案中的所有内容都位于“apple ld静态链接未使用符号”的前几个谷歌搜索结果中:)

谢谢你用谷歌搜索这个。在mac-yeilds“Mach-O”对象上编译,与ELF相反,我认为ELF与
--gc部分
开关一起使用。我尝试了
-gfull
开关和
-dead\u strip
但没有成功。