在CMake中使用find_package时,是否会显式包含标头

Does the header would be included explicitly when use find_package in CMake?

本文关键字:是否 包含标 package CMake find      更新时间:2023-10-16

当我为C++使用PyTorch时,只需使用find_package来设置依赖关系非常容易。这是CMakeLists.txt:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(dcgan)
set(CMAKE_PREFIX_PATH /User/root/libtorch) # I added this line, does it effect?
find_package(Torch REQUIRED)
add_executable(dcgan dcgan.cpp)
target_link_libraries(dcgan "${TORCH_LIBRARIES}")
set_property(TARGET dcgan PROPERTY CXX_STANDARD 14)

没有任何包含标头的显式命令,但如果存在target_link_libraries(dcgan "${TORCH_LIBRARIES}"),则可以找到标头。我很好奇为什么即使没有target_include_directories(dcgan PUBLIC ${TORCH_INCLUDE_DIRS})也能找到头文件。

该代码在PyTorch的官方网站上,适用于MacOS和Linux。发生了什么。

添加:包位于编译器一无所知的目录中。

include路径可以设置为依赖项中的传播设置:

target_link_libraries

指定链接给定目标时要使用的库或标志和/或其家属。链接库目标的使用要求将为传播。目标依赖项的使用要求影响汇编自己的资料。

https://cmake.org/cmake/help/latest/command/target_link_libraries.html

这意味着target_link_libraries将配置目标。它将设置target_compile_featurestarget_compile_optionstarget_compile_directories,如果它们在依赖关系中设置为INTERFACEPUBLIC

例如

add_library(Lib ${SRCS_LIB})
target_include_directories(Lib INTERFACE ${DIRECTORY})
add_exectuable(Exe ${SRCS_EXE})
target_link_libraries(Exe PRIVATE Lib)

在本例中,Exe将继承来自Lib的include目录。您不需要显式地设置它们。

柯南也是这样工作的,例如开始

cmake_minimum_required(VERSION 2.8.12)
project(MD5Encrypter)
add_definitions("-std=c++11")
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(md5 md5.cpp)
target_link_libraries(md5 ${CONAN_LIBS})

以及在有效的现代CMake 中如何描述

使用外部包的导出目标

不要回到过去CMake使用外部包定义的变量的样式。使用而是通过CCD_ 12导出目标。

最佳做法是不要对依赖项使用target_include_directories