我正在使用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)

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

编辑:为了澄清,这就是我添加库的方式:
target_link_libraries(TestExe gtest gtest_main)

和其他完全一样,但是这次它不是一个exe,而是一个dll
add_library(TestLib SHARED ${TestLib_HEADERS} ${TestLib_SOURCES} )
target_link_libraries(TestLib realsense2)

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

最佳答案

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

add_subdirectory(${Foo_SOURCE_DIR} ${Foo_BINARY_DIR})

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

如何使用,通过add_subdirectory包含的项目完全是,直到该项目为止:
  • 一些项目(包括gtest)通过Foo和其他命令将属性与其相关联,从而以“现代” CMake方式创建库目标target_include_directories。因此,要使用此库,只需调用target_link_libraries即可。
  • 其他一些项目需要include_directoriestarget_link_libraries才能使用。
  • 最后,有很多项目,当通过add_subdirectory包含时,这些项目根本无法工作。因此,FetchContent对他们有一点意义。

  • 只有一小部分项目描述了如何通过add_subdirectory方法与它们一起工作。 gtest就在其中。

    但是大多数项目根本就没有这样描述。如果要对这样的项目之一进行add_subdirectory编码,则需要调查该项目的内部信息以了解其用法。或使用试错法。

    关于c++ - CMake FetchContent不复制库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56593161/

    10-09 19:54