【发布时间】:2020-12-09 02:19:16
【问题描述】:
我有一个生成共享库的目标,称为 A,它依赖于另一个共享库,称为 B。
我有一些依赖于 A 的目标,将它们称为 C、D 和 E。
我想将 A 和 B 复制到每个 C、D 和 E 在磁盘上的位置。
正式地说,我想将共享库 A 和 A 所依赖的任何其他共享库复制到依赖于 A 的任何目标的位置。
如何在 cmake 中实现这一点?这甚至可能吗?
【问题讨论】:
标签: cmake
我有一个生成共享库的目标,称为 A,它依赖于另一个共享库,称为 B。
我有一些依赖于 A 的目标,将它们称为 C、D 和 E。
我想将 A 和 B 复制到每个 C、D 和 E 在磁盘上的位置。
正式地说,我想将共享库 A 和 A 所依赖的任何其他共享库复制到依赖于 A 的任何目标的位置。
如何在 cmake 中实现这一点?这甚至可能吗?
【问题讨论】:
标签: cmake
假设您已经完全控制了生成所有 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) 作为目录名称的一部分来解决此问题。
【讨论】: