Xcode-捆绑包太大
Xcode - bundle too large
我有一个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编译器4.2编译这个,大小相同。
有什么想法可以缩小捆绑包的尺寸吗?
我大胆猜测,这是由于从您的项目中导出的符号造成的。我们在这里谈论的不是调试符号,而是每个类、方法、构造函数、异常处理程序展开段等的符号表条目。后一类在使用异常和标准库的项目中占了很多。
如果你使用STL、boost或其他任何有很多模板的东西,你也会对你使用它们的每一种类型(通常是整个类,而不仅仅是方法)都有专门的知识,而且链接很弱。随着模板扩展和参数类型的C++名称篡改,符号名称的长度变得巨大。
编译windows DLL时,必须使用编译器指令(通常使用DLLExport
宏)或链接器符号导出列表显式导出符号。
在基于MacOSX和ELF的*NIX系统上,情况正好相反:它们都是默认导出的。链接器无法知道模块可能链接到什么,因此也无法知道哪些模块有用或不有用。实际上,应用程序通常只需要导出main
和任何未解析的符号。
标记为private
的C++类成员也没有区别。你也得到了这些符号。
苹果公司的这篇参考文章描述了如何限制符号的可见性。您过去当然可以使用gcc
做到这一点,但快速查看clang
的等效功能表明,它在那里没有得到很好的支持。
膨胀的二进制大小是编译的二进制文件带有调试符号的结果。
转到"项目"/"编辑项目设置"菜单项,单击构建选项卡上的"代码生成"部分,取消选中生成调试符号。您可以在搜索字段中键入"sym"来帮助查找它。
- 当我的阵列太大时出现分段错误
- 为什么C++程序在太大时返回代码而不是答案?
- googletest:测试太大的数据结构
- 整数文本太大,无法用任何整数类型表示--C++
- C++ boost::multi_array索引太大
- 使用 MinGW 构建 ASSIMP 会导致文件太大错误
- 与WM_DPICHANGED消息一起发送的建议窗口大小太大
- 在 Cygwin G++ 上编译的文件太大
- iOS:添加静态库后C++应用大小太大
- 当小部件太大时,Gtk 3
- 将字符转换为ASCII返回数字太大
- 这个查找查询是否出错,因为我输入的数字太大
- 词频程序 - 文件输入太大?
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 一个倒梯形,但如果输入高度对于宽度来说太大,那么它应该报告,不可能("不可能的形状"是什么)
- Pollard Rho 在不太大的输入上崩溃
- std::矢量容量变得太大了
- 在int到char转换期间,int将在char中存储在char中,如果int太大,将在char中存储的值
- 当偏移太大(大于签名的INT 2^32范围)时,GZSEEK(ZLIB)失败
- Xcode-捆绑包太大