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的效果,你就应该将该头文件放置