c++ - 不同平台的相同源的二进制大小如何变化

标签 c++ linux visual-studio-2015

我有一大堆多线程源代码,其中包括五个静态链接库(这也是同一解决方案的一个项目)。我使用 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/

相关文章:

linux - Raspberry Pi 3-除通过以太网外无互联网; WIFI上网但无法使用互联网

c++ - 将多个运算符与运算符重载一起使用会产生奇怪的错误

c++ - 改变数组值的指针算法

linux - 提取复杂字符串的片段

c# - 建议正确的数据类型来存储用户的生日

c++ - 创建项目,项目创建失败visual studio

visual-studio - Visual Studio发布不将所有DLL复制到发布文件夹

c++ - 将 std::string 转换为 char* const* 的数组

c++ - 什么是 "orthogonal linked list"?

c++ - 链接到 bzip2 库时未定义对 '_fdopen' 的引用