CMake FetchContent不复制库

时间:2019-06-14 07:09:38

标签: 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)

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

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

target_link_libraries(TestExe gtest gtest_main)

和其他完全相同,但是这次它不是一个exe而是dll

add_library(TestLib SHARED ${TestLib_HEADERS} ${TestLib_SOURCES} )
target_link_libraries(TestLib realsense2)

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

1 个答案:

答案 0 :(得分:1)

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

add_subdirectory(${Foo_SOURCE_DIR} ${Foo_BINARY_DIR})

“获取的”项目(作为源)将位于${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这样的项目之一,则需要研究该项目的内部知识以了解其用法。或使用试错法。