Visual Studio 和 cmake 上的 .lib 和 .dll 文件大小差异

问题描述 投票:0回答:1

我关注了 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 创建相同的文件?怎么办?

c++ visual-studio cmake dll static-libraries
1个回答
0
投票

如果没有看到 IDE 传递给编译器和链接器的完整命令行,就很难确定地回答这个问题。

模块尺寸的差异可能由多种原因造成,例如:

  • 支持库的动态和静态链接之间不匹配(
    /MDd
    vs.
    /MTd
  • 不同的异常处理模型(
    /EH
    )
  • 不同的浮点行为 (
    /fp
    )
  • 不同的目标架构(例如 x86 与 x64)
  • ...

您必须比较传递给编译器和链接器的命令行,看看是否存在任何差异。

模块的大小也很可能由于导致导入库增长的原因而增长:CMake 脚本将

WINDOWS_EXPORT_ALL_SYMBOLS
属性设置为
TRUE
。这是 Microsoft 构建工具的非标准行为,其中符号默认为私有且必须显式导出。

如果您要求 every 符号公开,这显然意味着您的导入库有更多条目,因此它会变得更大。因此,如果您从模块中导出更多符号,那么该模块的导出表也会增长。

这里还有一个不太明显的效果:当符号是私有的时,链接器可以轻松证明它是否正在被使用。所有潜在的用途必须来自模块内部。如果链接器可以证明某个符号未被使用,则可以将其从生成的模块中删除。另一方面,如果您将所有内容公开,则链接器将无法再执行此优化。

那么,只需删除

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)

从您的 CMake 脚本中,您可能会看到更多可比较的结果。一旦该行消失,请确保不再将此特定属性设置为

TRUE

© www.soinside.com 2019 - 2024. All rights reserved.