cmake可传递私有包含目录

cmake可传递私有包含目录,cmake,Cmake,鉴于此cmake示例项目: lib1/CMakeLists.txt: add_library(lib1 src1.cpp) target_include_directories(lib1 PUBLIC include) add_library(lib2 src2.cpp) target_include_directories(lib2 PUBLIC include) target_link_libraries(lib2 PRIVATE lib1) add_library(lib3 src3.

鉴于此cmake示例项目:

lib1/CMakeLists.txt:

add_library(lib1 src1.cpp)
target_include_directories(lib1 PUBLIC include)
add_library(lib2 src2.cpp)
target_include_directories(lib2 PUBLIC include)
target_link_libraries(lib2 PRIVATE lib1)
add_library(lib3 src3.cpp)
target_include_directories(lib3 PUBLIC include)
target_link_libraries(lib3 PRIVATE lib2)
lib2/CMakeLists.txt:

add_library(lib1 src1.cpp)
target_include_directories(lib1 PUBLIC include)
add_library(lib2 src2.cpp)
target_include_directories(lib2 PUBLIC include)
target_link_libraries(lib2 PRIVATE lib1)
add_library(lib3 src3.cpp)
target_include_directories(lib3 PUBLIC include)
target_link_libraries(lib3 PRIVATE lib2)
lib3/CMakeLists.txt:

add_library(lib1 src1.cpp)
target_include_directories(lib1 PUBLIC include)
add_library(lib2 src2.cpp)
target_include_directories(lib2 PUBLIC include)
target_link_libraries(lib2 PRIVATE lib1)
add_library(lib3 src3.cpp)
target_include_directories(lib3 PUBLIC include)
target_link_libraries(lib3 PRIVATE lib2)
所有.cpp和.h文件都是虚拟文件,它们之间没有依赖关系

从文档中我了解到,将“私有”目标库从lib2添加到lib1意味着在编译lib3时不应添加lib1 include目录。但是,当使用cmake(3.3.2)和“make VERBOSE=1”启动编译时,编译“src3.cpp”的命令行包含“-I/../lib1/include”:

我做错了什么

根据我在文档中的理解,添加了一个“PRIVATE” 从lib2到lib1的目标库意味着lib1包含目录 编译lib3时不应添加

你的假设是正确的

但是,由于属性如何在依赖目标之间传播的遗留原因,在中指定旧版本时,此正确行为将被停用

通过将版本更改为3.0或更高版本,您将获得正确的行为:

cmake_minimum_required(VERSION 3.0)

 ...
另请参见。

您好,您可以尝试在target_include_库中使用$,因为我在计算生成和安装界面时没有任何包含错误。将“target_include_目录(lib1 PUBLIC include)”更改为“target_include_目录(lib1 PUBLIC$)”不会更改结果。我没有任何错误。我希望链接lib3时不包含lib1。您的版本是什么?建议如果您使用
cmake\u-minimum\u required(3.0版)
或更高版本,问题可能会消失。您是对的。我得了2.8分。当更改为“3.0”时,它将按预期工作。谢谢