之前写过一篇文章《从零搭建Cortex-M4工程》,通过整个过程我们可以看到手动编写Makefile是一件较为麻烦的重复性劳动,而程序员们总是擅长将繁琐的重复性劳动变得简单有趣,于是有了CMake工具,只要编写简单的脚本就可以通过CMake生成复杂的Makefile或者Project文件。
今天我通过一个样例向大家展示如何使用CMake快速搭建一个格式化的工程结构。
首先介绍一下工程结构:
目录结构如下:
./bin 存放最终输出的二进制可执行文件
./inc 存放头文件
./src 存放C文件
./lib 存放编译出来的库文件
代码文件说明:
dc_sort.c/dc_sort.h 分治法排序
heap_sort.c/heap_sort.h 堆排序
debug.c/debug.h 调试用代码
m_type.h 统一类型定义
t_main.c 测试用主程序
位于根目录和src目录下的两个CMakeList.txt文件就是我们这次要讲的CMake脚本:
(1) 添加头文件路径
调用CMake函数include_directories,参数为头文件路径,语法与Shell相同:
include_directories(${PROJECT_SOURCE_DIR}/inc)
CMake中有两个比较重要的路径变量,PROJECT_SOURCE_DIR与PROJECT_BINARY_DIR,一般:
PROJECT_BINARY_DIR为执行cmake命令的目录
PROJECT_SOURCE_DIR为cmake命令后跟随的目录
例如:
我们在bin目录执行命令:cmake ../src
那么此时:
$(PROJECT_BINARY_DIR) = ./bin/
$(PROJECT_SOURCE_DIR = ./src/
(2) 添加编译源文件
在变量APP_SRC中指定需要编译为二进制的源文件
set(APP_SRC t_main.c debug.c)
(3) 添加库源文件
在变量SRC_LIB中添加需要编译为库的源文件
set(SRC_LIB dc_sort.c heap_sort.c)
(4) 添加二进制文件输出路径
在变量EXECUTABLE_OUTPUT_PATH中添加二进制文件的最终输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
(5) 添加库文件输出路径
在变量LIBRARY_OUTPUT_PATH中添加库文件的最终输出路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
(6) 添加库文件生成依赖
通过add_library函数建立库文件在Makefile中的依赖脚本
add_library(lib_sort ${SRC_LIB})
(7) 添加二进制文件生成依赖关系
通过add_executable函数建立二进制文件生成依赖
add_executable(test ${APP_SRC})
(8) 增加二进制文件到库文件的链接依赖
通过TARGET_LINK_LIBRARIES函数将库文件链接到二进制文件
TARGET_LINK_LIBRARIES(test lib_sort)
最终根目录CMakeList.txt文件内容如下:
1 2 3 | project(test) set(CMAKE_C_COMPILER "gcc") add_subdirectory(src) |
src路径下CMakeList.txt文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 | include_directories(${PROJECT_SOURCE_DIR}/inc) set(APP_SRC t_main.c debug.c) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) set(SRC_LIB dc_sort.c heap_sort.c) set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) add_library(lib_sort ${SRC_LIB}) add_executable(test ${APP_SRC}) TARGET_LINK_LIBRARIES(test lib_sort) |
根目录下执行命令:
cmake .
make
总共只写了11行脚本,是不是非常简单?
本文中的代码我已经push到github上,可以访问:https://github.com/plumpyomi/algorithm.git