gpt4 book ai didi

installation - 如何使用CMake将子目录安装到不同位置?

转载 作者:行者123 更新时间:2023-12-02 04:19:17 44 4
gpt4 key购买 nike

我有几个 CMake 项目,它们定义了自己的安装逻辑。现在,我想添加一个全局 CMakeLists.txt,它使用 add_subdirectory() 添加这些项目,以便一次构建和安装所有项目。我如何从外部为每个人提供不同的 ${CMAKE_INSTALL_PREFIX}

我尝试的是更改调用之间的安装前缀以添加子目录,但它们是在实际调用 make install 时安装的,并且当时安装前缀已设置为最后分配的值.

最佳答案

如果您的子项目需要相同的变量具有不同的值(在全局范围内),则无法使用 add_subdirectory 构建它们在单个全局项目内。

相反,全局项目可以使用 cmake 安装它们通过 execute_process 调用或ExternalProject_Add 。有时,install(SCRIPT)命令可以用于此目的。


使用 execute_process 安装 使子项目立即可用 configuration阶段。

当子项目有某种打包机制时可以使用它(参见 CMake tutorials about packaging ),因此全局对象可能会执行 find_package(<subproject-name>)并以最简单的方式与子项目中定义的库链接(使用变量,在外部填充)。

# Configure subproject into <subproject-build-dir>
execute_process(COMMAND ${CMAKE_COMMAND} -D<var>=<value> <subproject-source-dir>
WORKING_DIRECTORY <subproject-build-dir>)
# Build and install subproject
execute_process(COMMAND ${CMAKE_COMMAND} --build <subproject-build-dir> --target install)
# Extract variables, related to subproject for link with it.
find_package(<subproject-name>)

# Create target in global project and link with subproject
include_directories(${<subproject-name>_INCLUDE_DIRS})
link_directories(${<subproject-name>_LIBRARY_DIRS})
add_executable(global_program main.cpp)
target_link_libraries(global_program ${<subproject-name>_LIBRARIES})

使用 ExternalProject_add 安装 将目标分配给子项目,该子项目将安装在 build阶段。在这种情况下与子项目链接也是可能的,但需要手动填充变量。

# Configure, build and install subproject
ExternalProject_Add(<subproject_target>
SOURCE_DIR <subproject-source-dir>
CMAKE_CACHE_ARGS -D<var>=<value>
BINARY_DIR <subproject-build-dir>
INSTALL_DIR <CMAKE_INSTALL_PREFIX-for-subproject>
)

# Create target in global project and link with subproject
include_directories(<subproject-include-files-location>)
link_directories(<subproject-libraries-location>)
add_executable(global_program main.cpp)
target_link_libraries(global_program <subproject-libraries-name>)
# Make sure that subproject will be built before executable.
add_dependencies(global_program <subproject_target>)

使用 install(SCRIPT) 安装install 处执行脚本阶段。当全局项目和子项目之间不存在构建依赖关系时,可以使用此方法。

subproject_install.cmake:

# Configure subproject into <subproject-build-dir>
execute_process(COMMAND ${CMAKE_COMMAND} -D<var>=<value> <subproject-source-dir>
WORKING_DIRECTORY <subproject-build-dir>)
# Build and install subproject
execute_process(COMMAND ${CMAKE_COMMAND} --build <subproject-build-dir> --target install)

CMakeLists.txt:

install(SCRIPT subproject_install.cmake)

关于installation - 如何使用CMake将子目录安装到不同位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31690253/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com