cmake

 

基础用法

 

 

PUBLIC PRIVATE INTERFACE 继承

刚开始接触感觉 PUBLIC,PRIVATE 和 INTERFACE 难以理解,所以创建一个项目以加深理解。按照文档说明,大部分东西都分成了 PRIVATE 和 INTERFACE 两种类型,按照字面理解,应该是 PRIVATE 继承后会被隐藏,而 INTERFACE 不会,相当于 c++ 中的 private 和 public。而 PUBLIC 同时包含两者。

为了验证以上说法,需要两个库被接连地继承。

依赖关系为:example.cpp --> greet.hpp, greet.cpp --> time.hpp, time.cpp

通过 target_compile_definitions 添加 #deines(TIME_PUBLIC, TIME_PRIVATE, TIME_INTERFACE),使用 target_link_libraries 继承,结果如下表

 

 

TIME_PUBLIC TIME_PRIVATE TIME_INTERFACE Link
time.cpp Y Y N
greet.cpp greet public Y N Y
greet private Y N Y
greet interface N N N
example.cpp greet public example public Y N Y Y
example private Y N Y Y
example interface N N N N
greet private example public N N N Y
example private N N N Y
example interface N N N N
greet interface example public Y N Y Y
example private Y N Y Y
example interface N N N N

 

由上表可知

 

实际上不需要把例子搞得那么复杂,因为 definition 中相当于有一次依赖了,只需要再一次的 greet 对 time 依赖即有两层依赖,example 的行为完全可以推断出来。

 

 

variable cached option

 

install

安装可执行文件或者库

 

test

 

google test

 

test data

有时候会把测试数据写在文件内,需要在测试时读取,但由于测试的二进制文件都是在 build 文件夹内构建的,路径会发生变化,需要复制数据文件到 build 目录下同时编译时更改数据文件。复制文件利用 cmake 中的 file 命令,修改路径利用宏定义。

假设在 test 目录下,有 test.cppCMakeLists.txt,还有包含测试数据文件 test_data 的子目录test/data

CMakeLists.txt

其中 CMAKE_CURRENT_BINARY_DIR 是在编译时生成的路径,表示生成当前二进制可执行文件的路径,如果 test 目录在项目根目录下,那么该变量表示 build/test 。而 CMAKE_BINARY_DIR 则表示顶级二进制文件目录,按我理解是 build 文件。

test.cpp