include_directories(${CMAKE_CURRENT_LIST_DIR})
这种非Target的命令会影响全局的编译器,所以在大型项目里面,推荐使用cmake现代的target api。
举例:
target_include_directories(lib1 PRIVATE ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries(app PRIVATE lib1)
全部都是PRIVATE,app没有lib1的dir
想要app中也继承lib的include_directories,只有这种情况
target_include_directories(lib1 INTERFACE ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries(app PUBLIC lib1)
target_include_directories(lib2 INTERFACE ${CMAKE_CURRENT_LIST_DIR}) target_include_directories(lib1 INTERFACE ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries(lib1 PUBLIC lib2) # 这个PUBLIC会蔓延至APP target_link_libraries(app PUBLIC lib1) # 因为app设置为PUBLIC
/
| 修饰符 | self target | link target |
| PUBLIC | √ | √ |
| PRIVATE | √ | × |
| INTERFACE | × | √ |
大部分情况下一路使用PUBLIC就行了
举个例子
在CMake中,PUBLIC、PRIVATE和INTERFACE是用于指定库/目标属性的关键字。
PUBLIC表示该属性将被传递给依赖项,同时也会应用于目标自身。其他目标如果依赖于当前目标,那么它们也可以使用当前目标的PUBLIC属性。PRIVATE表示该属性只适用于当前目标,不会被传递给依赖项。这意味着其他目标不会继承当前目标的PRIVATE属性。INTERFACE表示该属性仅供依赖项使用,不会应用于目标自身。其他目标依赖于当前目标时,可以使用当前目标的INTERFACE属性。
这些属性通常用于使用target_link_libraries()函数指定目标之间的依赖关系。例如:
cmakeCopy Code add_library(foo STATIC foo.cpp) target_include_directories(foo PUBLIC include) add_library(bar STATIC bar.cpp) target_include_directories(bar PRIVATE include) add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE foo) target_link_libraries(myapp PUBLIC bar)
在上面的示例中,foo库具有PUBLIC属性,因此它的include目录将被公开,并可供其他目标使用。而bar库具有PRIVATE属性,所以它的include目录只能在内部使用。
对于myapp可执行目标,foo库使用PRIVATE属性链接到它,表示myapp可执行目标是私有地依赖于foo库的。而bar库使用PUBLIC属性链接到myapp目标上,所以其他目标如果依赖于myapp,也可以访问bar库。
这种属性的设置可以帮助控制库/目标属性的可见性和继承性,使得依赖关系更加清晰和可管理。