less than 1 minute read

Install CMake

https://cmake.org/install/

https://www.cnblogs.com/yanqingyang/p/12731855.html

升级gcc/g++

https://blog.csdn.net/gatieme/article/details/52871438

后面编译googletest的时候报错,检查发现是gcc版本只有4.8,无法支持一些c++11特性。

CMake Basics

https://github.com/ttroy50/cmake-examples/tree/master/01-basic

cmake主要就是一个CMakeLists.txt文件。这个文件是由一个个函数组成的。例如下面的基本文件:

cmake_minimum_required(VERSION 2.6)
project (hello_cmake)
add_executable(${PROJECT_NAME} main.cpp)

${PROJECT_NAME}类似于“变量”。这里会自动赋值到project名,也就是hello_cmake

可以用set()函数来为变量赋值。有些变量相当于系统属性,比如

set(CMAKE_CXX_STANDARD 11)

就会把C++ standard设成11。

函数参数的顺序是有规律的。一般来说是输出在前,输入在后。比如说:

add_executable(
  hello_test
  hello_test.cc
)

就是从hello_test.cc编译出hello_test。

插一嘴:常见错误

当我想编译多个test时,写成了:

add_executable(
  hello_test
  fact_test
  hello_test.cc
  fact_test.cc
)

这显然就不合函数逻辑:我怎么知道哪个源文件编译到哪个输出呢?

所以符合逻辑的代码如下:

add_executable(
  hello_test
  hello_test.cc
)
add_executable(
  fact_test
  fact_test.cc
)

样例分析:googletest示例中的CMakeFiles.txt

https://github.com/yuhengfdada/gtest-practice/blob/master/CMakeLists.txt

include()

enable_testing()

add_executable()

target_link_libraries()

googletest

https://google.github.io/googletest/quickstart-cmake.html

https://google.github.io/googletest/primer.html

定义格式:

TEST(TestSuiteName, TestName) {
  ... test body ...
}

test statement有ASSERT_*EXPECT_*两种。这两个的区别是assert fail会直接terminate,但是expect不会。所以推荐用expect。

然后。嗯。就没什么了其实。大多设置就还是在CMake里面。