Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于不同的平台,同一个源的二进制大小如何变化_C++_Linux_Visual Studio 2015 - Fatal编程技术网

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

C++ 对于不同的平台,同一个源的二进制大小如何变化,c++,linux,visual-studio-2015,C++,Linux,Visual Studio 2015,我有一大堆多线程源代码,其中包括五个静态链接库(这也是同一解决方案的一个项目)。我使用CMake工具(版本3.7.1)为MSVC(VS2015)和Linux(Unix Makefiles)生成解决方案。因为它必须在多个平台上运行,所以所有特定于平台的头文件都是单独包含的 我大部分时间都在Windows build上做了更多的工作,优化价值如下 set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2") set(CMAKE_CXX_FLAGS_DEBUG "/MTd /O0")

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

我大部分时间都在Windows build上做了更多的工作,优化价值如下

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上为1698KB,在Linux上为17121988字节,约16MB

因为有两种不同的构建选项(发布和调试),所以我们与Linux有相似之处。如果是这样,应该如何区分这些构建选项

我还使用了
add_定义(“-W-Wall-Wextra-Wno unused参数-Wno重载虚拟-Wconversion-ggdb”)


如何最小化Linux二进制大小。我见过类似的帖子,但我的问题是反之亦然。

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

如果删除
-g
标志,您将看到二进制大小显著减小。您可以通过添加
-Os
标志进一步减小大小,这将优化构建的二进制文件以减小大小。您甚至可以通过添加
-s
(从最终二进制文件开始)来进一步减小大小


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

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