我有一个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大小的想法?
答案 0 :(得分:1)
由于您的项目中导出的符号,我猜测会发生这种情况。我们这里不讨论调试符号,而是每个类,方法,构造函数,异常处理程序展开段等的符号表条目。后一类在使用异常和标准库的项目中占了很多。
如果你正在使用STL,boost或其他任何有很多模板的东西,你也会对你使用它们的每种类型(通常是整个类 - 不仅仅是方法)都有专门化,并且链接很弱。使用模板扩展和参数类型的C ++名称修改,符号名称的长度变得非常大。
编译Windows DLL时,必须使用编译器指令(通常使用DLLExport
宏)或链接器符号导出列表显式导出符号。
在MacOSX和基于ELF的* NIX系统上,情况恰恰相反:它们都是默认导出的。链接器无法知道模块可能链接到什么,因此哪些模块有用或无效。实际上,应用程序通常只需要导出main
和任何未解析的符号。
标记为private
的C ++类成员也没有区别。你也得到了这些符号。
Apple的这个reference描述了如何限制符号的可见性。您当然可以使用gcc
执行此操作 - 但快速查看clang
的等效内容表明它在那里得不到支持。
答案 1 :(得分:-1)
膨胀的二进制大小是具有调试符号的已编译二进制文件的结果。
转到“项目”/“编辑项目设置”菜单项,单击“构建”选项卡,在“代码生成”部分下,取消选中“生成调试符号”。您可以在搜索字段中输入“sym”来帮助找到它。