【问题标题】:How to add a custom command to targets that depend on a specific target如何将自定义命令添加到依赖于特定目标的目标
【发布时间】:2020-12-09 02:19:16
【问题描述】:

我有一个生成共享库的目标,称为 A,它依赖于另一个共享库,称为 B。

我有一些依赖于 A 的目标,将它们称为 C、D 和 E。

我想将 A 和 B 复制到每个 C、D 和 E 在磁盘上的位置。

正式地说,我想将共享库 A 和 A 所依赖的任何其他共享库复制到依赖于 A 的任何目标的位置。

如何在 cmake 中实现这一点?这甚至可能吗?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    假设您已经完全控制了生成所有 5 个目标的所有 CMakeLists.txt 文件,您可以设置构建 .dll 或 .so 文件的位置。假设您想在安装步骤之后指定位置,您可以单独指定安装位置。

    引用目标的命令需要在使用add_library/add_executable创建目标之后放置。

    set_target_properies(A PROPERTIES 
         ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # import libraries
         LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" # .so files
         RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" # .dll files/programs
    )
    
    # similar as above, but specifying the path relative to CMAKE_INSTALL_PREFIX
    install(TARGETS A
        ARCHIVE DESTINATION lib
        LIBRARY DESTINATION bin
        RUNTIME DESTINATION bin
    )
    

    根据您的需要,您只需要其中一个命令,并且可以将目标A 替换为目标列表。这样您可以避免重复命令 5 次。不过,我建议您在创建目标的 CMakeLists.txt 文件中执行此操作。

    尽管输出目录是相对于上述当前目录的,但我们通过使用构建目录的绝对路径 (CMAKE_BINARY_DIR) 作为目录名称的一部分来解决此问题。

    【讨论】:

    • 不幸的是,这并不能完全回答我的问题。虽然这可能是一个很好的解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多