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

时间:2017-01-10 18:49:47

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

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

1 个答案:

答案 0 :(得分:1)

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

如果删除-g标志,您应该会看到二进制大小显着减少。您可以通过添加-Os标志来进一步缩小大小,这将优化构建的二进制文件以减小大小。您甚至可以通过添加-s进一步缩小尺寸,{{1}}来自最终二进制文件。{/ p>

请注意,您可能只想为“Release”构建执行上述操作 - 您需要保留“Debug”构建的所有调试信息,以便可以使用GDB和其他工具进行调试。 / p>