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
库。
这种属性的设置可以帮助控制库/目标属性的可见性和继承性,使得依赖关系更加清晰和可管理。