MSVC 链接动态库,静态库作为链接器输入

MSVC links against dynamic library with static library as linker input

我有项目,link针对 OpenBLAS。在 Visual Studio 的项目属性中,我在 "Additional Dependencies" 中将完整路径设置为 openblas.lib,但 MSVC 仍然会生成一个依赖于 openblas.dll.

的二进制文件

该项目是由 CMake 使用 OpenBLAS imported target OpenBLAS::OpenBLAS 生成的,但我认为出于调试目的最有趣的问题是,为什么 MSVC 不 link 文件中的对象作为输入提供。

Windows 上的 *.lib 可以是 DLL 的导入库或静态库。

CMake 中的库是使用 STATICSHARED 属性构建的。如果在 Windows 平台上默认 省略 ,则会构建一个共享库。这可以通过在 CMake 命令行上定义 -DBUILD_SHARED_LIBS=OFF 来更改。

当您从 OpenBLAS 发布 CMakeLists.txt 时,您默认在 Windows 平台上构建 DLL。所以你链接到的库是一个导入库。

TL;DR:要将 OpenBLAS 构建为静态库,您需要在 运行 配置步骤时在 CMake 命令行上传递 -DBUILD_SHARED_LIBS=OFF