cmake transitive private包含目录

时间:2018-03-02 11:47:20

标签: cmake

鉴于此cmake示例项目:

LIB1 /的CMakeLists.txt:

add_library(lib1 src1.cpp)
target_include_directories(lib1 PUBLIC include)

LIB2 /的CMakeLists.txt:

add_library(lib2 src2.cpp)
target_include_directories(lib2 PUBLIC include)
target_link_libraries(lib2 PRIVATE lib1)

LIB3 /的CMakeLists.txt:

add_library(lib3 src3.cpp)
target_include_directories(lib3 PUBLIC include)
target_link_libraries(lib3 PRIVATE lib2)

所有.cpp和.h文件都是虚拟文件,它们之间没有依赖关系。

根据我从文档中的理解,添加了一个" PRIVATE"从lib2到lib1的目标库意味着在编译lib3时不应添加lib1 include目录。但是,当使用cmake(3.3.2)和#34;启动编译时,使用VERBOSE = 1&#34 ;,命令行来编译" src3.cpp"包含" -I /.../ lib1 / include":

c++ -I/.../lib3/include -I/.../lib2/include -I/.../lib1/include -o .../src3.cpp.o -c /.../lib3/src3.cpp

我出错了什么?

1 个答案:

答案 0 :(得分:2)

  

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

您的假设是正确的。

但是,由于遗产原因导致属性在依赖目标之间传播,因此在cmake_minimum_required中指定旧版本时会停用此正确行为。

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

cmake_minimum_required(VERSION 3.0)

 ...

另见this thread on the CMake mailing list

相关问题