CMake中PUBLIC、PRIVATE、INTERFACE

C++修饰属性回顾

在这里插入图片描述
在这里插入图片描述

PUBLIC特性

所有跟在PUBLIC后面的objects(targets)都能够被目前正在创建的target链接,并且能够提供接口到所有依赖这个current target的targets提供接口。所谓接口,就是指的PUBLIC_LINK的objects能够供后面依赖当前target的lib target或者exe target使用,这个就和C++的继承非常相似。

这里可以延伸以下特性就是,加入当前的target正在依赖自己已经创建的target库,而那个target库又PUBLIC依赖于PROJ Lib,那么此时当前的target不管是私有链接还是公有链接,都可以使用PROJ Lib中的函数,因为我们已经创建的target为我们开放了PROJ Lib的接口(PUBLIC_LINK)
PRIVATE特性

这个属性就和C++的私有继承一样,我们暂且将PUBLIC PRIVATE INTERFACE继承的target看作是成员函数,相当于我们当前的子类继承了父类,而父类又声明其所依赖的lib target为私有依赖,私有依赖只供父类使用,但是我子类想要使用父类的成员函数(即PRIVATE修饰的库),但是又因其是私有属性,所以最后的结果就是build失败。

INTERFACE特性

PUBLIC后面所跟targets可以供自己使用和子类使用,但是INTERFACE就只能供子类进行使用,只是方便子类使用而已。

例子解释

这个例子也是参照别人的例子,假如east_apple exe公有或者私有链接于apple.lib(之所以不用INTERFACE的缘故就是因为用了之后相当于east_apple.exe只是为了子类做了嫁衣,自己却不能使用),此时apple_size函数调用了fruit.lib的size和color函数,但是现在有个问题就是加入我的east_apple.exe调用size和color就会出现问题,因为fruit.lib并不能提供给孙子辈使用。
在这里插入图片描述

总结

INTERFACE LINK最惨,因为它就是一个简单的交换机的作用,为别人做嫁衣。

PRIVATE only cares about himself and does not allow inheritance. INTERFACE only cares about others and allows inheritance. PUBLIC cares about everyone and allows inheritance.
实际中的使用规范

从参考网址3你可以得到以下语句

If you are creating a shared library and your source cpp files #include the headers of another library (Say, QtNetwork for example), but your header files don't include QtNetwork headers, then QtNetwork is a PRIVATE dependency.

If your source files and your headers include the headers of another library, then it is a PUBLIC dependency.

If your header files but not your source files include the headers of another library, then it is an INTERFACE dependency

你知道意味着什么吗?
很大一部分这个PRIVATE PUBLIC INTERFACE并不能约束子类的使用,更多的是你要按照这个规则去实施。
例如虽然说PRIVATE LINK名义上说的是不让子类进行使用该特性链接的库,但是如果你将#include <proj.h>放置在头文件中,自然它库中所含的项目就能被子类使用。所以如果你想要实现PRIVATE的效果,你就应该将该头文件放置

参考网址

网址1
网址2
网址3

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CMakePRIVATE关键字用于指定目标之间的私有依赖关系。当一个目标使用PRIVATE关键字依赖于另一个目标时,这个依赖关系不会传递给依赖目标的其他目标。换句话说,只有直接依赖的目标可以访问被依赖目标的头文件和库文件。\[2\] 在你提供的示例,当一个目标使用PRIVATE关键字依赖于另一个目标时,它可以访问被依赖目标的头文件和库文件,但这个依赖关系不会传递给其他目标。\[1\]所以,当你在CMake使用PRIVATE关键字时,你可以确保依赖关系的范围是私有的,只有直接依赖的目标可以使用被依赖目标的内容。 #### 引用[.reference_title] - *1* *3* [CMAKEPRIVATEPUBLICINTERFACE属性示例详解](https://blog.csdn.net/weixin_43862847/article/details/119762230)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [理解cmake PRIVATEPUBLICINTERFACE 的含义和用法](https://blog.csdn.net/qq_41314786/article/details/129970547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值