【问题标题】:Can I install shared imported library?我可以安装共享导入库吗?
【发布时间】:2016-12-16 00:07:09
【问题描述】:

我有一个外部项目和一个导入的共享库。包含目录和 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 并给出该属性的值。它似乎有效,但有更好、更惯用的 cmake 解决方案吗?

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

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

    1. 来自bug report的一位CMake开发者的评价

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

    2. 当安装 normal 库时,CMake 可以对其进行修改以调整 RPATH 等一些属性。这样的修改是可能的,因为 CMake 知道库是如何构建的。这是将库安装为 TARGET 的主要优势。

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

    【讨论】:

    • rpath 实际上是少数可以在 elf 二进制文件中很容易修改的属性之一nixos.org/patchelf.html
    • install(TARGET) 有一个有用的属性,这里没有介绍。它还在类 Unix 系统上创建从 .so 到 .so..so.. 的链接。
    【解决方案2】:

    在 CMake 3.21 中,install(...) 有一个名为 IMPORTED_RUNTIME_ARTIFACTS 的新子命令。

    查看完整的documentation

    在你的情况下,你可以这样做:

    install(IMPORTED_RUNTIME_ARTIFACTS my_shared_lib)
    

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2022-10-07
      相关资源
      最近更新 更多