2

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

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

Debug symbols也被关闭。

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

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

我可以用 LLVM GCC 4.2 或 Apple LLVM Compiler 4.2 编译它,大小是一样的。

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

4

2 回答 2

1

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

如果您使用 STL、boost 或其他任何带有大量模板的东西,那么您还将拥有与它们一起使用的每种类型的特化(通常是整个类 - 不仅仅是方法),并且链接较弱。由于模板扩展和参数类型的 C++ 名称修饰,符号名称的长度变得很大。

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

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

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

Apple 的这份参考资料描述了如何限制符号的可见性。您当然曾经能够做到这一点gcc- 但快速查看等效的 forclang表明它在那里没有得到很好的支持。

于 2013-08-30T19:32:36.930 回答
-1

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

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

于 2013-08-29T00:04:28.423 回答