[√]cmake的链接属性PRIVATE、PUBLIC、INTERFACE权限控制

简介: [√]cmake的链接属性PRIVATE、PUBLIC、INTERFACE权限控制
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中,PUBLICPRIVATEINTERFACE是用于指定库/目标属性的关键字。

  • 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库。

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

目录
相关文章
|
设计模式 编译器 API
【C/C++ Pimpl模式】隐藏实现细节的高效方式 (Pimpl Idiom: An Efficient Way to Hide Implementation Details)
【C/C++ Pimpl模式】隐藏实现细节的高效方式 (Pimpl Idiom: An Efficient Way to Hide Implementation Details)
1678 1
|
Unix 编译器 Linux
【计算机基础 ELF文件】深入探索ELF文件:C++编程中的关键组成部分
【计算机基础 ELF文件】深入探索ELF文件:C++编程中的关键组成部分
903 0
|
安全 编译器 C语言
深入理解C/C++预处理器指令#pragma once以及与ifndef的比较
深入理解C/C++预处理器指令#pragma once以及与ifndef的比较
1085 0
|
Ubuntu Linux
【Ubuntu系统内核更新与卸载】
【Ubuntu系统内核更新与卸载】
1192 0
|
存储 Shell iOS开发
CMake中文手册_target_link_libraries(3.26)
CMake中文手册_target_link_libraries(3.26)
1537 0
|
IDE 开发工具 C++
CMake中文手册_target_sources(3.26)
CMake中文手册_target_sources(3.26)
1149 0
|
设计模式 算法 编译器
【CMake中的链接权限详解 】深入理解CMake中PRIVATE、PUBLIC与INTERFACE的链接
【CMake中的链接权限详解 】深入理解CMake中PRIVATE、PUBLIC与INTERFACE的链接
493 0
|
缓存 Linux C++
map异常崩溃分析汇总
文章讨论了std::map和std::set在某些情况下崩溃的原因,包括结构体字节对齐问题、多线程资源同步问题、以及比较器的实现问题,并提供了相应的解决方案。
497 0
|
Ubuntu 安全 网络协议
|
Unix Linux Shell
CMake深度解析:掌握add_custom_command,精通Makefile生成规则(三)
CMake深度解析:掌握add_custom_command,精通Makefile生成规则
3049 2