[√]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库。

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

目录
相关文章
|
3月前
|
并行计算 Linux C语言
【Deepin 20系统】解决Error: unsupported compiler: 8.3.0. Use --override to override this check.
本文介绍了在Deepin 20系统中解决安装CUDA 10.0时遇到的GCC版本不支持问题的具体步骤。
47 2
|
5月前
|
安全 Java 编译器
springboot @resource与private final声明式的有何区别??
【6月更文挑战第3天】在Spring Boot中,@Resource 和 private final 常用于依赖注入,但它们的用途和行为有一些重要的区别。
185 1
|
6月前
|
PHP
PHP public、protected、private、static、abstract、final、interface、implements 区别对比
PHP public、protected、private、static、abstract、final、interface、implements 区别对比
76 0
|
6月前
|
Java Scala
idea报错“Static methods in interface require -target:jvm-1.8”
idea报错“Static methods in interface require -target:jvm-1.8”
45 0
|
6月前
|
设计模式 算法 编译器
【CMake中的链接权限详解 】深入理解CMake中PRIVATE、PUBLIC与INTERFACE的链接
【CMake中的链接权限详解 】深入理解CMake中PRIVATE、PUBLIC与INTERFACE的链接
225 0
|
程序员 iOS开发 开发者
iOS开发:报错‘Unknown class ViewController in Interface Builder file’解决方法
在iOS开发过程中,会遇到一些比较常见的错误,尤其是刚入门的初级开发者,如果不熟练的话就会出错,本篇博文就来分享一个常见的问题,即报错‘Unknown class ViewController in Interface Builder file’的解决方法。
472 1
iOS开发:报错‘Unknown class ViewController in Interface Builder file’解决方法
Java中访问修饰符public、private、protect、default范围
Java中访问修饰符public、private、protect、default范围
|
iOS开发
Xcode消除警告:Unknown class ViewController in Interface Builder file
Xcode消除警告:Unknown class ViewController in Interface Builder file
284 0
|
Java 编译器 Spring
IDEA 出现问题:出现private field ‘xxx‘ is never assigned警告解决方案
IDEA 出现问题:出现private field ‘xxx‘ is never assigned警告解决方案
986 0
IDEA 出现问题:出现private field ‘xxx‘ is never assigned警告解决方案
|
JSON 数据格式
sonar代码质量检测告警“static“ base class members should not be accessed via derived types
sonar代码质量检测告警“static“ base class members should not be accessed via derived types
841 0
sonar代码质量检测告警“static“ base class members should not be accessed via derived types