前言
Cmake
是一个跨平台的C/C++项目组织管理工具,虽然许多IDE都有私有的项目管理工具,但是在现在2019年,各大IDE基本都支持了CMAKE
的管理,所以如果有跨平台的需求,使用CMAKE
管理是最方便的。
包含单元测试的简单工程
CMAKE
支持gtest
,cppunit
这种单元测试框架,当然也可以使用断言自定义单元测试,我在一个小项目里用了一个纯c宏编写的小型单元测试 github/minunit,与Cmake
的搭配很好。
一个典型的项目目录
│ .gitignore
│ CMakeLists.txt
├─include
│ xxxxx.h
├─src
│ main.cpp
├─build
│ ...
└─test
xxx_test.cpp
CMakeLists.txt
其中test
目录可以作为子项目,和主目录分开编译,避免main
函数重复。
主目录的CMakeLists.txt
CMake
主要通过分析CMakeLists.txt
所规定的条件来生成对应平台的Makefile
,所以CMakeLists.txt
需要手动编写。
cmake_minimum_required(VERSION 2.8)
set(CXX_STANDARD_REQUIRED 11)
set(CMAKE_CXX_FLAGS "-g") # 调试信息
set(CMAKE_CXX_FLAGS "-Wall") # 开启所有警告
project(PDSTL)
set(PROJECT_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)
aux_source_directory(${CMAKE_SOURCE_DIR}/src proj_src)
add_executable(${PROJECT_NAME} ${proj_src})
add_subdirectory(test)
enable_testing()
add_test(test_xxx ${CMAKE_SOURCE_DIR}/build/test/test_xxx)
下面来逐一解释
传递编译参数
如果需要向编译器传递参数,如传递优化级别,设置警告级别等,可以向CMAKE
传递CMAKE_CXX_FLAGS
参数。
细化的还有CMAKE_CXX_FLAGS_DEBUG
和CMAKE_CXX_FLAGS_RELEASE
。
建立构建目标
add_executable(${PROJECT_NAME} ${proj_src})
其中的${}
都是简单的宏替换,是根据project(xxx)
中推出来的。这一步是传递给CMAKE
编译的目标。
子项目
add_subdirectory(test)
,要求子目录里必须有一个子CMakeLists.txt
,包含了子目录的编译信息。
单元测试
enable_testing()
这里提示cmake
添加一个test
的编译目标,调用make test
会编译所有下列的add_test
的目标并运行。
add_test(test_xxx ${CMAKE_SOURCE_DIR}/build/test/test_xxx)
不难理解,add_test(test_name binary_location)
,前一个参数是某一个单元测试的名字,后一个参数是该单元测试的路径。
test目录的CMakeLists.txt
test
作为子项目,主要要生成单元测试的二进制文件。
project(test)
cmake_minimum_required(VERSION 2.8)
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include")
set(PROJECT_TEST_BINARY_DIR ${CMAKE_SOURCE_DIR}/build/test/)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_TEST_BINARY_DIR})
set(CMAKE_CXX_STANDARD 11)
add_executable(test_xxx xxx_test.cpp)
其中加入了一句
set(PROJECT_TEST_BINARY_DIR ${CMAKE_SOURCE_DIR}/build/test/)
,来控制test_xxx
的输出路径。${CMAKE_SOURCE_DIR}
是一个CMAKE
的自带变量,代表着源码的根路径。
编译运行
Windows平台下打开powershell
,输入cmake -G "MinGW Makefiles" .
,mingw-make.exe all
,mingw-make.exe test
,即可看见测试。IDE多数可以自动识别CMakeLists.txt
。