库的 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.lib
和mylib.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
)。
我的图书馆有最少的、直接的 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.lib
和mylib.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
)。