对于不同的平台,同一源的二进制大小如何变化
how does same source vary in binary size for different platform
我有一个巨大的多线程源代码包,其中包括五个静态链接的库(这也是同一解决方案的项目)。我使用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 和其他工具进行调试。
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么预减量会导致奇怪的变化?
- MATLAB:跟踪imufilter对象中的状态变化
- 当父小部件大小发生变化时,如何更改子小部件的大小?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 为什么使用默认构造函数"{}"而不是"= default"存在性能变化?
- 当对象传递给成员函数时,成员函数的行为会发生变化?