0%

CMake集成GTest

第一次接触到较打的C++项目,项目由CMake构建,并使用GTest测试,而我之前对CMake的认知仅仅是Clion提供的自动创建和修改CMakeList.txt,对C++测试仅仅停留在写宏定义和测试用例,对LLT测试框架完全没有映像。搞懂项目的构建原理有利于尽快上手项目,于是打算在本文梳理一下CMake和GTest的基本用法,完整实现一个集成CMake和GTest的项目。

CMake

C源文件可以用gcc编译,但是文件一旦多了编译的命令也就复杂了,这时候引入Makefile组织项目文件编译,但是Makefile更偏向与机器语言,可读性差、难以维护,且不能兼容qmake\nmake等其他构建工具。

CMake(Cross platfrom Make)是一款支持多平台开源的C项目构建工具,支持生成多平台的构建文件。

flowchart LR
  CMakeLists.txt --CMake--> Makefile --make--> id1((Unix ELF))
  CMakeLists.txt --CMake, qmake--> id2((Qt Release))
  CMakeLists.txt --CMake, nmake--> id3((MSVC EXE))

工程样例

- src/
- include/
- protocol/
- build/
- bin/

一般一个CMake项目根目录会有一个build目录,用于存放构建过程中产生的临时文件,例如:外部依赖编译产生的静态/动态库,内部模块构建产生的静态/动态库。这种方式称为外部构建,可以防止构建过程污染项目空间。

CMakeList.txt

cmake_minimum_required(VERSION 3.12)
project(snake)
message("building ${PROJECT_NAME} to ")

set(CMAKE_CXX_STANDARD 11)

option(EXCUTABLE_PATH $PROJECT_SOURCE_DIR/bin)

add_subdirectory(protocol)

add_executable(snake_server

)

TARGET_LINK_LIBRARIES(snake_server pthread curses protobuf)

相关指令:

  • cmake_minimum_required设置CMake最小版本号要求
  • project声明工程名称
  • set用于定义变量,option用于,变量可用EL表达式获得
  • add_subdirectory用于引入子构建目录,会去加载该位置的CMakeLists.txt,子构建目录可以多层嵌套
  • if() else()选择分支

GTest

GMock

Disqus评论区没有正常加载,请使用科学上网