【问题标题】:how does same source vary in binary size for different platform不同平台的相同源的二进制大小如何变化
【发布时间】:2017-05-25 09:02:26
【问题描述】:

我有一大堆多线程源代码,其中包括五个静态链接库(这也是相同解决方案的一个项目)。我使用 CMake 工具(版本 3.7.1)为 MSVC(VS2015)和 Linux 的 Makefile(Unix Makefiles)生成解决方案。由于它必须在多个平台上运行,所有平台特定的头文件都单独包含。

我大部分时间都在 Windows 构建上工作更多,优化价值为

set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd /O0")

对于 Linux

set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -fexceptions -fpermissive -Os")

但二进制文件的大小差异很大。在 Windows 上为 1,698KB,在 Linux 上为 17121988 字节,大约 16MB。

由于有两个不同的构建选项(发布和调试),我们有类似于 Linux 的。如果是这样,应该如何区分这些构建选项。

我也使用add_definition("-W -Wall -Wextra -Wno-unused-parameter -Wno-overloaded-virtual -Wconversion -ggdb")

如何最小化 Linux 二进制文件的大小。我看过类似的帖子,但问题对我来说反之亦然。

【问题讨论】:

  • CMAKE_CXX_FLAGS 的三种形式有点不透明。您可能想要扩展隐藏在它们后面的标志。事实上,添加生成的完整命令行将消除所有歧义。
  • @user4581301:-fexceptions -fpermissive -Os。除了这三个之外,我在 Linux 和 Windows 上构建时没有看到任何东西 "/DWIN32 /D_WINDOWS /W3 /GR /EHsc /MP"
  • 目标处理器(x86、ARM、...)和地址大小(32 位或 64 位)也会影响二进制文件的大小。

标签: c++ linux visual-studio-2015


【解决方案1】:

您使用的-ggdb 标志在您的构建中包含调试符号。使用 GCC/Linux,它们直接嵌入到可执行文件中,而不是像在 Windows 上那样编译到单独的数据库 (*.PDB) 中。这可能是您的 Linux 构建显着变大的原因之一。

如果您删除-g 标志,您应该会看到二进制大小显着减小。您可以通过添加-Os 标志进一步减小大小,这将优化构建的二进制文件以减小大小。您甚至可以通过添加-s 来进一步减小大小,strips the symbol table and relocation information 来自最终二进制文件。

请注意,您可能只想为“发布”版本执行上述操作 - 您需要为“调试”版本保留所有调试信息,以便您可以使用 GDB 和其他工具进行调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多