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

时间:2019-12-18 10:46:27

标签: windows dll cmake lib

我的库具有相关行的最少,直接的CMake代码

“Cannot obtain information about the node because the specified selector does not match any node in the DOM tree.”

在Windows下执行时,系统会在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) 中生成mylib.dll,并在...\build\Release中生成mylib.libmylib.exp(这是什么?)。它只会安装...\build\lib\Release

我的应用程序具有最少,直接的CMake代码来搜索我的库:

mylib.dll

哪个可以在Linux下工作,但可以在Windows下工作

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)

从实验中我知道,只要只有一个-- Could NOT find MyLib (missing: MyLib_LIBRARIES) 文件并且没有关联的.DLL导入库,就会发生此错误。

我应该更正MyLib来安装.LIB吗?怎么样?

或者是否可以修改我的应用程序,使其仅对mylib.lib满意?怎么样?

迄今为止的研究

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

此链接cmake : shared library : how to get the .lib name instead of .dll name?可能是相关的,但不够明确。其他两个问题CMake generated VS project expecting lib instead of dllLinking dll/lib to a cmake project似乎相关,但没有答案。

1 个答案:

答案 0 :(得分:0)

命令install将共享库的.lib文件分类为ARCHIVE。 documentation中明确指出:

  

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

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

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

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