Xcode - 捆绑太大

时间:2013-08-23 07:12:13

标签: c++ xcode macos visual-studio-2012

我有一个C ++项目,它是一个动态库。当我在Windows(Visual Studio 2012)上编译它时300 kB大。但是当我使用XCode在Mac上编译它时,它在包中有3.9 MB二进制文件。

我选择了优化级别Fastest, Smallest [-Os]选项。

Debug symbols也已关闭。

项目是相同的,唯一的额外框架是Cocoa.framework,我需要成功编译项目。 Cocoa.framework可以链接这么多吗?

这是一个糟糕的链接器工作吗?

我可以使用LLVM GCC 4.2或Apple LLVM Compiler 4.2编译它,大小相同。

如何减少.bundle大小的想法?

2 个答案:

答案 0 :(得分:1)

由于您的项目中导出的符号,我猜测会发生这种情况。我们这里不讨论调试符号,而是每个类,方法,构造函数,异常处理程序展开段等的符号表条目。后一类在使用异常和标准库的项目中占了很多。

如果你正在使用STL,boost或其他任何有很多模板的东西,你也会对你使用它们的每种类型(通常是整个类 - 不仅仅是方法)都有专门化,并且链接很弱。使用模板扩展和参数类型的C ++名称修改,符号名称的长度变得非常大。

编译Windows DLL时,必须使用编译器指令(通常使用DLLExport宏)或链接器符号导出列表显式导出符号。

在MacOSX和基于ELF的* NIX系统上,情况恰恰相反:它们都是默认导出的。链接器无法知道模块可能链接到什么,因此哪些模块有用或无效。实际上,应用程序通常只需要导出main和任何未解析的符号。

标记为private的C ++类成员也没有区别。你也得到了这些符号。

Apple的这个reference描述了如何限制符号的可见性。您当然可以使用gcc执行此操作 - 但快速查看clang的等效内容表明它在那里得不到支持。

答案 1 :(得分:-1)

膨胀的二进制大小是具有调试符号的已编译二进制文件的结果。

转到“项目”/“编辑项目设置”菜单项,单击“构建”选项卡,在“代码生成”部分下,取消选中“生成调试符号”。您可以在搜索字段中输入“sym”来帮助找到它。