我有一大堆多线程源代码,其中包括五个静态链接库(这也是同一解决方案的一个项目)。我使用 CMake 工具(版本 3.7.1)为 MSVC(VS2015)和 Makefile for Linux(Unix Makefiles)生成解决方案。由于它必须在多个平台上运行,因此所有平台特定的头文件都单独包含。
我大部分时间都在 Windows 构建上工作更多,优化值(value)为
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。
由于有两种不同的构建选项(Release 和 Debug),我们是否与 Linux 相似。如果是这样,应该如何区分这些构建选项。
我还使用 add_definition("-W -Wall -Wextra -Wno-unused-parameter -Wno-overloaded-virtual -Wconversion -ggdb")
如何最小化 Linux 二进制大小。我看过类似的帖子,但对我来说反之亦然。
最佳答案
您正在使用的 -ggdb
标志在您的构建中包含调试符号。在 GCC/Linux 中,这些被直接嵌入到可执行文件中,而不是像在 Windows 上那样被编译到一个单独的数据库 (*.PDB) 中。这可能是您的 Linux 构建明显更大的原因之一。
如果删除 -g
标志,您应该会看到二进制大小显着减少。您可以通过添加 -Os
标志进一步减小大小,这将优化构建的二进制文件以减小大小。您甚至可以通过添加 -s
进一步减小大小,这 strips the symbol table and relocation information来自最终的二进制文件。
请注意,您可能只想为“发布”版本执行上述操作 - 您需要保留“调试”版本的所有调试信息,以便您可以使用 GDB 和其他工具进行调试。
关于c++ - 不同平台的相同源的二进制大小如何变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41576184/