我的库有最少、简单的 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项目似乎相关,但没有答案。
命令
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
)。