我有一个外部项目和一个导入的共享库。 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并给出该属性的值来解决这个问题。它似乎有效,但是有更好的,更惯用的解决方案吗?
答案 0 :(得分:11)
CMake不允许将 IMPORTED 库安装为 TARGETS 。请改用install(FILES)
。
这种行为至少有两个原因:
导入的目标最初是为从某些外部软件包的现有安装导入而设计的,因此当时安装没有意义。
安装普通库时,CMake可以修改它以调整RPATH等属性。这样的修改是可能的,因为CMake 知道如何构建库。这是将库安装为 TARGET 的主要优点。
但对于 IMPORTED 库,CMake没有关于库编译过程的信息,也无法对其进行任何合理的修改。因此,CMake可能只按原样安装库文件:对简单install(FILES)
没有优势。