CMake FetchContent 不复制库

Ama*_*ann 3 c++ cmake

我正在使用 CMake FetchContent 下载和构建第三方库(在本例中为 realsense2)。在尝试了官方文档 ( https://cmake.org/cmake/help/v3.11/module/FetchContent.html ) 中的 googletest 示例后,它的工作方式给我留下了深刻的印象。包括标题是神奇地完成的。现在使用 realsense2 SDK 我遇到了问题。

我需要添加一个额外的 include_directories 命令,如下所示:

FetchContent_Declare(
realsense2
GIT_REPOSITORY https://github.com/IntelRealSense/librealsense.git
GIT_TAG        v2.23.0
)
FetchContent_MakeAvailable(realsense2)
FetchContent_GetProperties(realsense2)
if(NOT realsense2_POPULATED)
    FetchContent_Populate(realsense2)
    add_subdirectory(${realsense2_SOURCE_DIR} ${realsense2_BINARY_DIR})
endif()
//I should not be required to do this according to documentation
include_directories(${realsense2_SOURCE_DIR}/include)
Run Code Online (Sandbox Code Playgroud)

如果我不这样做,则找不到某些标题。关于这个问题有什么建议吗?

编辑:为了澄清,这就是我添加库的方式:

target_link_libraries(TestExe gtest gtest_main)
Run Code Online (Sandbox Code Playgroud)

另一个完全一样,但这次不是exe而是dll

add_library(TestLib SHARED ${TestLib_HEADERS} ${TestLib_SOURCES} )
target_link_libraries(TestLib realsense2)
Run Code Online (Sandbox Code Playgroud)

在这一点上我更关心为什么我不必为 googletest 框架添加任何包含

Tsy*_*rev 5

的主要目的FetchContent是保证在通话时

add_subdirectory(${Foo_SOURCE_DIR} ${Foo_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)

“获取的”项目将(作为源)在${Foo_SOURCE_DIR}目录中。

如何使用包含通过的项目add_subdirectory完全取决于该项目

  1. 一些项目(包括 gtest)Foo通过使用target_include_directories和其他命令将属性与其关联,以“现代”CMake 方式创建库目标。因此,要使用这样的库,只需调用target_link_libraries.

  2. 其他一些项目需要两者include_directoriestarget_link_libraries与它们一起工作。

  3. 最后,有很多项目,当通过add_subdirectory. 所以FetchContent对他们来说意义不大。

只有一小部分项目描述了如何通过add_subdirectory方法与他们合作。并且gtest是其中之一。

但大多数项目根本没有描述这一点;如果您想add_subdirectory与这样的项目一起使用,那么您需要调查该项目的内部结构以了解其用法(或使用反复试验)。

  • 请注意,大多数 CMake 项目旨在通过“find_package”进行安装和使用。这将是处理您的项目所需的最稳定的方式。如果您想在配置您的项目期间安装其他项目(因此`find_package` 将起作用),那么可以通过组合`execute_process` 和`ExternalProject_Add`(该方法仅谷歌)来实现。 (2认同)