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

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

我的库有最少、简单的 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下执行时,系统会在

mylib.dll
中生成
...\build\Release
,在
mylib.lib
中生成
mylib.exp
...\build\lib\Release
(那是什么?)。它只安装
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
?怎么办?

目前已完成的研究

不是关于静态与动态链接(DLL和LIB文件 - 什么以及为什么?cmake针对dll/lib的链接):我想要

dynamic linking
;如果需要
.LIB
文件,则与静态链接无关。

此链接cmake:共享库:如何获取.lib名称而不是.dll名称?可能是相关的,但不够明确。另外两个问题CMake生成的VS项目需要lib而不是dll将dll/lib链接到cmake项目似乎相关,但没有答案。

windows cmake dll static-libraries
1个回答
0
投票

命令

install
将共享库的
.lib
文件分类为 ARCHIVE。这在文档中明确说明:

对于 DLL 平台(所有基于 Windows 的系统,包括 Cygwin),DLL 导入库被视为

ARCHIVE
目标。

因此您还需要将 ARCHIVE 子句添加到

install()
来安装
.lib
文件:

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

也不是,运行时目标通常指定为

bin
,与可执行文件的目标相同。这有助于 Windows 上的可执行文件找到共享库 (
.dll
)。

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