当然了,在最终子目录的 CMakeLists.txt 文件中,使用include_directories()和target_include_directories()的效果是相同的。 4. 目录划分 每一个目录都是一个模块,目录内部应将对外和对内的头文件进行区分,由模块的调用者决定模块是否被传递(PRIVATE,INTERFACE,PUBLIC)。 5. 参考: https://cmake.org/pipermail/c...
target_include_directories(target [SYSTEM] [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) 其中,`target` 是目标名称,可以是库或可执行文件的名称。 `SYSTEM` 表示这些头文件是系统头文件,`BEFORE` 表示这些路径将被添加到其他路径之前。`INTERFACE`、`...
include_directories会对当前CMakeLists.txt文件的目标文件生效,并会通过add_subdirectory调用传递到子目录;target_include_directories则针对指定的目标文件生效。 target_include_directories对于指定目标添加的目录,有三种范围可选,PUBLIC、PRIVATE和INTERFACE。INTERFACE和PUBLIC会添加到<target>的INTERFACE_INCLUDE_DIRECTORIES属...
各级子目录中无需使用target_include_directories()或者include_directories()了。如果此时查看详细的编译过程(make VERBOSE=1)就会发现编译过程是一大坨,很不舒服。 当然了,在最终子目录的 CMakeLists.txt 文件中,使用include_directories()和target_include_directories()的效果是相同的。 4. 目录划分 每一个目录都...
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) 指定编译给定目标时要使用的包含目录。命名的<target>必须是由add_executable()或add_library()等命令创建的,并且不能是ALIAS target。
include_directories()的影响范围最大,可以为CMakelists.txt后的所有项目添加头文件目录 一般写在最外层CMakelists.txt中影响全局 target_include_directories target_include_directories()的影响范围可以自定义。如加关键子PRIVATE或这PUBLIC。 一般引用库路径使用这个命令,作为外部依赖项引入进来,target是自己项目生成的li...
target_link_libraries(hello-world INTERFACE hello) target_include_directories(hello-world INTERFACE hello) 1. 2. PUBLIC:公开的。PUBLIC = PRIVATE + INTERFACE。生成 libhello-world.so 时,在 hello_world.c 和 hello_world.h 中都包含了 hello.h。并且 main.c 中也需要使用 libhello.so 提供的功能。
则需要后一个。后一个是因为target_include_directories()支持PRIVATE,PUBLIC和INTERFACE限定符。
这些关键字用于告诉何时需要传递给目标的包含目录列表。when表示是否需要这些包含目录:
3.3 将PUBLIC改成PRIVATE 如果我们对CMakeLists.txt做如下修改,请问上面main.c还能不能正常运行 cmake_minimum_required(VERSION3.22)project(CPP)set(CMAKE_CXX_STANDARD17)add_library(A libA/interface_a.c)target_include_directories(APUBLIC${CMAKE_CURRENT_SOURCE_DIR}/includeA)add_library(BSHAREDlibB/inte...