Xcode-捆绑包太大

Xcode - bundle too large

本文关键字:包太大 Xcode-      更新时间:2023-10-16

我有一个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"来帮助查找它。