库的 CMake 生成 DLL。应用程序的 CMake 需要 LIB

Library's CMake generates DLL. Application's CMake wants LIB

我的图书馆有最少的、直接的 CMake 代码和相关行

add_library(MyLib <sources>)

install(
    TARGETS MyLib
    LIBRARY DESTINATION ${destination}/lib
    RUNTIME DESTINATION ${destination}/lib
    COMPONENT Libraries)
install(
    FILES mylib.h
    DESTINATION ${destination}/include
    COMPONENT Headers)

在Windows下执行时,系统在...\build\Release生成mylib.dll,在...\build\lib\Release生成mylib.libmylib.exp(那是什么?) =].它只安装 mylib.dll.

我的应用程序使用最少、直接的 CMake 代码来搜索我的库:

find_path(MyLib_INCLUDE_DIR mylib.h)
find_library(MyLib_LIBRARIES NAMES MyLib)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MyLib DEFAULT_MSG MyLib_LIBRARIES MyLib_INCLUDE_DIR)

在 Linux 下有效,但在 Windows 下会导致

-- Could NOT find MyLib (missing: MyLib_LIBRARIES)

根据实验,我知道只要只有一个 .DLL 文件,并且没有关联的 .LIB 导入库,就会发生此错误。

我要更正 MyLib 以安装 mylib.lib 吗?怎么样?

或者是否可以修改我的申请,使其仅满足 mylib.dll?怎么样?

目前已完成的研究

这是不是关于静态与动态linking (DLL and LIB files - what and why?, cmake link against dll/lib):我想要dynamic linking;如果需要 .LIB 文件,则它与静态 linking.

无关

这个linkcmake : shared library : how to get the .lib name instead of .dll name? may be pertinent, but is not explicit enough. Two other questions CMake generated VS project expecting lib instead of dll, Linking dll/lib to a cmake project好像有关系,但是没有答案。

命令 install 将共享库的 .lib 文件分类为 ARCHIVE。 documentation:

中明确说明了这一点

For DLL platforms (all Windows-based systems including Cygwin), the DLL import library is treated as an ARCHIVE target.

因此您还需要将 ARCHIVE 子句添加到 install() 以安装 .lib 文件:

install(
    TARGETS MyLib
    ARCHIVE DESTINATION ${destination}/lib
    LIBRARY DESTINATION ${destination}/lib
    RUNTIME DESTINATION ${destination}/bin
    COMPONENT Libraries)

同样,运行时目标通常指定为 bin,与 可执行文件 的目标相同。这有助于 Windows 上的可执行文件找到共享库 (.dll)。