gpt4 book ai didi

c++ - 使用 CMake 仅构建一次外部库

转载 作者:可可西里 更新时间:2023-11-01 18:31:04 26 4
gpt4 key购买 nike

我的 C++ 项目包含第三方库的源代码(目前作为 git 子模块)。

这个库由我们的主 CMakelists 通过使用 add_subdirectory 添加到项目中,然后库与主目标链接。

这是我当前 Cmake 文件的简化版本:

add_subdirectory(foo)
set(FOO_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/libfoo/libfoo.so)

add_executable(target main.cpp)
add_dependencies(target foo)
target_link_libraries(target ${FOO_LIBRARY})

这个库需要很长时间来构建,因为我不更改它的代码,所以我只需要构建一次(每个构建配置)。但是当我清理并重建我的代码时,它也会清理库文件并重新编译它们。

我尝试设置属性 CLEAN_NO_CUSTOM在库的目录中,但根据文档,它仅适用于自定义命令目标。

CMake 中是否有一种机制可以指定此库目标只需要生成一次,或者不被 make clean 清除?

最佳答案

正如@Tsyvarev 所说,在您的情况下,ExternalProject_Add 优于add_subdirectoryadd_subdirectory 当您希望项目成为构建系统的重要组成部分时非常有用,因为它创建的目标可以在 target_link_libraries() 命令的右侧使用而 ExternalProject_Add 创建的目标则不能。

这是我在我的一个项目中使用的方法。您尝试查找所需的库并仅在找不到时才构建它。我使用 INTERFACE 库将 FOO_EXTERNAL 转换为 target_link_libraries() 可接受的目标。

add_library(foo INTERFACE)
find_package(foo ${FOO_VER})
if(NOT foo_FOUND)
include(ExternalProject)
include(GNUInstallDirs)
ExternalProject_Add(FOO_EXTERNAL
SOURCE_DIR "${FOO_SOURCE_DIR}"
BINARY_DIR "${FOO_BINARY_DIR}"
INSTALL_DIR "${FOO_INSTALL_DIR}"
CMAKE_ARGS "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}"
"-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"

"-DCMAKE_INSTALL_PREFIX=${FOO_INSTALL_DIR}"
)

add_dependencies(foo FOO_EXTERNAL)
set(foo_LIBRARY
"${FOO_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}foo${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(foo_INCLUDE_DIR "${FOO_INSTALL_DIR}/include")
endif()

target_link_libraries(foo INTERFACE ${foo_LIBRARY})
target_include_directories(foo INTERFACE ${foo_INCLUDE_DIR})

关于c++ - 使用 CMake 仅构建一次外部库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38123948/

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