CMake典型应用参考样例

CMake 是一个跨平台的自动化建构系统,用于管理软件构建过程。 很久很久以前编译一个C/C++工程通常采用手写Makefile文件的方法。 现在使用CMake则改为手写CMakeLists.txt文件,然后用CMake自动生成Makefile文件。 由于手写CMakeLists.txt比手写Makefile要简便许多,因此CMake逐渐流行起来。


典型应用场景 工程目录结构如下:

├─build/
├─src/
├─CMakeLists.txt
└─mk.sh

build目录是一个空目录,用于存放编译生成的临时文件。 src目录是源代码目录,下面有若干子目录。 CMakeLists.txt文件则在根目录,管理整个工程。 mk.sh是快速编译脚本,省去频繁地敲cmake和make指令,也可以根据需要添加更多便捷功能。

mk.sh中的关键指令:

cd ./build
cmake ../
make -j4

下面是一个典型的CMakeLists.txt示例,以此为基础稍作修改就能应用到实际项目中。 这个示例中,使用aux_source_directory来搜索指定目录下的所有源文件,并参与编译。 同时也可以使用list(REMOVE_ITEM)来屏蔽指定的源文件不参与编译。

# 最小版本要求
cmake_minimum_required(VERSION 3.0)

# 指定目标系统
set(CMAKE_SYSTEM_NAME Linux)

# 指定目标平台
set(CMAKE_SYSTEM_PROCESSOR arm)

# 指定交叉编译工具链的根目录
set(TOOLCHAIN_PATH "/root/toolchain/gcc")

# 指定C编译器
set(CMAKE_C_COMPILER "${TOOLCHAIN_PATH}/bin/arm-linux-gnu-gcc")

# 指定C++编译器
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PATH}/bin/arm-linux-gnu-g++")

# 指定C选项
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "-static -Wall")
set(CMAKE_C_FLAGS_RELEASE "-O2")
set(CMAKE_C_FLAGS_DEBUG "-g -rdynamic -O0")

# 指定C++选项
set(CMAKE_CXX_STANDARD 99)
set(CMAKE_CXX_FLAGS "-static -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
set(CMAKE_CXX_FLAGS_DEBUG "-g -rdynamic -O0")

# 工程定义
project(main C CXX)

# 预定义
add_definitions(-DVERSION="1.0")

# 头文件包含路径
include_directories(
	./src
	./src/dir1
	./src/dir2
	./src/dir3
)

# 源文件
aux_source_directory(./src             SRC_LIST)
aux_source_directory(./src/dir1        SRC_LIST)
aux_source_directory(./src/dir2        SRC_LIST)
aux_source_directory(./src/dir3        SRC_LIST)

# 屏蔽特定源文件不参与编译
list(REMOVE_ITEM SRC_LIST "./src/dir2/file.c")

# 库文件路径
link_directories(build)

# 库文件
link_libraries(pthread)
link_libraries(m)

# 目标文件
add_executable(${PROJECT_NAME} ${SRC_LIST})