我可以安装共享导入的库吗?

时间:2016-12-16 00:07:09

标签: cmake

我有一个外部项目和一个导入的共享库。 include目录和implib都可正常工作,但尝试安装共享库(dll)失败,并出现以下错误:

install TARGETS given target "my_shared_lib" which does not exist in this directory.

这里的代码重现:

add_library(my_shared_lib SHARED IMPORTED GLOBAL)
set_property(TARGET my_shared_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib")
set_property(TARGET my_shared_lib PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.dll")
set_property(TARGET my_shared_lib PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.lib")

add_executable(main main.cpp)
add_dependencies(main my_shared_lib)
target_link_libraries(main PUBLIC my_shared_lib)

install(TARGETS main DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST")
install(TARGETS my_shared_lib DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST")

有什么想法吗?

编辑:目前我已经通过使用get_property取出IMPORTED_LOCATION,然后使用INSTALL FILES并给出该属性的值来解决这个问题。它似乎有效,但是有更好的,更惯用的解决方案吗?

1 个答案:

答案 0 :(得分:11)

CMake不允许将 IMPORTED 库安装为 TARGETS 。请改用install(FILES)

这种行为至少有两个原因:

  1. 来自bug report

    的CMake开发人员之一
      

    导入的目标最初是为从某些外部软件包的现有安装导入而设计的,因此当时安装没有意义。

  2. 安装普通库时,CMake可以修改它以调整RPATH等属性。这样的修改是可能的,因为CMake 知道如何构建库。这是将库安装为 TARGET 的主要优点。

    但对于 IMPORTED 库,CMake没有关于库编译过程的信息,也无法对其进行任何合理的修改。因此,CMake可能只按原样安装库文件:对简单install(FILES)没有优势。