我正在使用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
包含的项目完全是,直到该项目为止:Foo
和其他命令将属性与其相关联,从而以“现代” CMake方式创建库目标target_include_directories
。因此,要使用此库,只需调用target_link_libraries
即可。 include_directories
和target_link_libraries
才能使用。 add_subdirectory
包含时,这些项目根本无法工作。因此,FetchContent
对他们有一点意义。 只有一小部分项目描述了如何通过
add_subdirectory
方法与它们一起工作。 gtest
就在其中。但是大多数项目根本就没有这样描述。如果要对这样的项目之一进行
add_subdirectory
编码,则需要调查该项目的内部信息以了解其用法。或使用试错法。关于c++ - CMake FetchContent不复制库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56593161/