我关注了 https://learn.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=msvc-170 在调试模式下创建 dll,并使用 cmake 执行相同的操作。
cmake_minimum_required(VERSION 3.19.1)
project(MathLibrary)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
add_library(MathLibrary SHARED MathLibrary.cpp)
毕竟我得到了
#### debug vs
2.4K Apr 7 15:10 Debug/MathLibrary.lib
38K Apr 7 15:10 Debug/MathLibrary.dll*
#### debug cmake
2.9K Apr 7 16:20 MathLibrary/build/Debug/MathLibrary.lib
52K Apr 7 16:20 MathLibrary/build/Debug/MathLibrary.dll*
为什么文件大小不同?还有什么不同?是否可以使用 cmake 创建相同的文件?怎么办?
如果没有看到 IDE 传递给编译器和链接器的完整命令行,就很难确定地回答这个问题。
模块尺寸的差异可能由多种原因造成,例如:
您必须比较传递给编译器和链接器的命令行,看看是否存在任何差异。
模块的大小也很可能由于导致导入库增长的原因而增长:CMake 脚本将
WINDOWS_EXPORT_ALL_SYMBOLS
属性设置为 TRUE
。这是 Microsoft 构建工具的非标准行为,其中符号默认为私有且必须显式导出。
如果您要求 every 符号公开,这显然意味着您的导入库有更多条目,因此它会变得更大。因此,如果您从模块中导出更多符号,那么该模块的导出表也会增长。
这里还有一个不太明显的效果:当符号是私有的时,链接器可以轻松证明它是否正在被使用。所有潜在的用途必须来自模块内部。如果链接器可以证明某个符号未被使用,则可以将其从生成的模块中删除。另一方面,如果您将所有内容公开,则链接器将无法再执行此优化。
那么,只需删除
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
从您的 CMake 脚本中,您可能会看到更多可比较的结果。一旦该行消失,请确保不再将此特定属性设置为
TRUE
。