对于不同的平台,同一源的二进制大小如何变化

how does same source vary in binary size for different platform

本文关键字:何变化 变化 二进制 平台 于不同      更新时间:2023-10-16

我有一个巨大的多线程源代码包,其中包括五个静态链接的库(这也是同一解决方案的项目)。我使用CMake工具(版本3.7.1)为MSVC(VS2015)和Linux(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 二进制大小。我见过类似的帖子,但问题对我来说反之亦然。

正在使用的-ggdb标志包括调试生成中的符号。在GCC/Linux中,这些直接嵌入到可执行文件中,而不是编译到单独的数据库中(*。PDB)就像他们在Windows上一样。这可能是您的 Linux 版本明显更大的原因之一。

如果删除 -g 标志,应会看到二进制大小显著减小。可以通过添加 -Os 标志来进一步减小大小,这将优化构建的二进制文件以减小大小。您甚至可以通过添加 -s 来进一步减小大小,这将从最终二进制文件中去除符号表和重新定位信息。

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