cmake - target_include_directories 上的生成器表达式的用例是什么?

标签 cmake header-files

我在多个地方看到在定义包含目录时使用生成器表达式的引用,因此您可以在编译和安装期间为包含定义不同的位置。例如:

# Define headers for this library. PUBLIC headers are used for
# compiling the library, and will be added to consumers' build
# paths.
target_include_directories(lib PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
    PRIVATE src)

我正在构建一个库项目,因为我使用标准路径( lib/ 用于静态库, include/ 用于公共(public)标题),我希望通过设置 CMAKE_INSTALL_PREFIX 来摆脱困境并使用一个简单的 install()调用,例如:
set(CMAKE_INSTALL_PREFIX "${MY_INSTALL_DIR}")
install(TARGETS myLibrary ARCHIVE PUBLIC_HEADERS)

我的期望是 DESTINATION将是两者的默认设置,所以我只是告诉 CMake 安装这些类型的文件。当然它不起作用,我需要为库和头文件显式设置目标。

所以问题仍然存在:如果我似乎无法使用 INSTALL_INTERFACE,那么开始时生成器表达式的用例是什么?反正?

这是我的示例 CMakeLists.txt:
cmake_minimum_required(VERSION 3.12.1)
project(my_library C)

FILE(GLOB SOURCE_FILES src/*.c)
add_library(my_library ${SOURCE_FILES})
target_include_directories(my_library PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>)

set(OUTPUT_DIR "${CMAKE_BINARY_DIR}/output")
set(INSTALL_DIR "${OUTPUT_DIR}/my_library")
set(INSTALL_LIB_DIR "${INSTALL_DIR}/lib")
set(INSTALL_INC_DIR "${INSTALL_DIR}/include")
set(CMAKE_INSTALL_PREFIX "${INSTALL_DIR}")
install(TARGETS my_library ARCHIVE DESTINATION lib)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include" DESTINATION include)
# I was hoping I could do, after setting the headers with the INSTALL_INTERFACE generator expression
#install(TARGETS my_library ARCHIVE PUBLIC_HEADERS)

最佳答案

类似生成器的表达式 $<BUILD_INTERFACE>$<INSTALL_INTERFACE>被 CMake 用来区分事物,不同的是 建树 安装树 .

在构建项目本身时,$<BUILD_INTERFACE>已使用但 $<INSTALL_INTERFACE>不是。

创建 时导出文件 install(EXPORT)命令,$<INSTALL_INTERFACE> 中列出的内容将被包含在其中,但在 $<BUILD_INTERFACE> 中的东西惯于。

但是创建一个导出文件 export命令使用 $<BUILD_INTERFACE> ,但不使用 $<INSTALL_INTERFACE> .

其他用于区分构建和安装树表达式 $<BUILD_INTERFACE>$<INSTALL_INTERFACE>不使用。

例如。 $<INSTALL_INTERFACE> 不是 影响install(TARGETS .. PUBLIC_HEADERS)命令。

关于cmake - target_include_directories 上的生成器表达式的用例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729233/

相关文章:

c++真的很困惑链接错误

c++ - 使用 CMake 在 LLVM 传递中使用多个源文件

cmake - 如何解决 GATE 构建文件生成错误

c++ - CMake:如何传递预处理器宏

c++ - Visual C++ 和 Allegro5 : cannot recognize objects from abstract class from header file

c++ - 不完整的字段类型 C++

C++:包括头文件编译失败但包括源 cpp 文件编译

c++ - 如何在C++中更清楚地包含头文件

cmake - CMAKE_FIND_LIBRARY_PREFIXES/CMAKE_FIND_LIBRARY_SUFFIXES 的默认值

cmake - 在当前范围和 PARENT_SCOPE 中设置一个变量?