内容:待细化
简单来说,3.x版本的cmake以target为核心,当用target_link_libraries/target_include_directoires这种命令时,如果指定flag为PUBLIC/INTERFACE, 会设置当前target的一些属性(target类似一个对象,而各种target_include_directoires…命令就相当于成员函数,对当前target产生一些副作用),当其他程序需要依赖当前target时,只需要target_link_libraries时把当前target link上就行了,不需要去include当前target的hpp/.h,因为当前target所有相关的头文件/依赖库都被target给包含了,所以三方程序直接target_link_libraries就好。
另,add_library(xxx, INTERFACE)不会编译出xxx库,而是会设置xxx库的一些属性,然后目标库就可以很简单的通过target_link_libraries(xxx)把xxx库所以来的东西都包含进来。相当于创建了一些xxx以及xxx依赖的各种文件/库的集合。
参考:
https://stackoverflow.com/questions/31969547/what-is-the-difference-between-include-directories-and-target-include-directorie
https://stackoverflow.com/questions/9339851/can-one-add-further-source-files-to-an-executable-once-defined
https://schneide.blog/2016/04/08/modern-cmake-with-target_link_libraries/
https://zhuanlan.zhihu.com/p/76975231(中文资料)
https://www.jianshu.com/p/55be9d4fc033(很好的中文资料,配合上面的基本就看懂了)