CMake基础入门教程 (一)
CMake作为一款跨平台编译工具,很好解决了不同平台编译标准不一致的问题,学习CMake的意义就在于,它可以让开发者编写一种与平台无关的CMake配置件来定制整个编译流程,使开发者不需要考虑各平台互不兼容的问题。
前言
- 在每个需要编译的目录下都要有一个 CMakeLists.txt 配置文件以便CMake执行
- CMake语法中不区分大小写,语法注释使用 #
- CMake语法有点像Shell,都是通过 ${变量名} 取变量值
从一个最简单的例子认识它
一个最基本的 CMakeLists.txt 应该是这样
# CMake 最低版本号 cmake_minimum_required (version 2.6) # 项目名称 project (CMakeTest) # 生成目标文件 add_executable (demo main.c)
- cmake_minimum_required :来指定此CMake运行的最低版本。
- project:指定项目的名称,CMake会将这个名称赋值给CMake内部的一个变量,这个之后讲。
- add_executable:生成目标文件,第一个参数是目标文件,后面的参数是它的依赖文件。
尝试一下
我们就简单打印一下 Hello CMake!,我们需要两个文件,CMakeLists.txt 和main.c文件。
CMakeLists.txt
# CMake 最低版本号 cmake_minimum_required (version 2.6) # 项目名称 project (CMakeTest) # 生成目标文件 add_executable (demo main.c)
main.c
#include<stdio.h> int main() { printf("Hello CMake! "); return 0; }
项目结构
这里建立一个build空目录的原因是,执行CMake会产生多余的CMake信息文件,为了不污染工作目录,我们在build目录下执行CMake让其工作目录保持整洁,这是一个写CMake的好习惯。 进入build目录,执行上层目录的CMakeLists.txt,然后执行CMake生成的Makefile文件,最终得到可执行程序。
cd build cmake ../ make ./demo
如果是编译同一个目录下多个源文件,也没有问题,只需将其余文件名作为参数加入即可,如下。
add_executable (demo main.c MyFunc1.c MyFunc2.c)
编译多个目录中的源文件
假如我的项目结构是这样的
main.c 文件需要用到 math 目录下的 myadd.c 文件中的一个MyAdd函数,我们直接将其作为静态库,让main.c 链接使用,这里就遇到了需要对多个目录进行编译,那么CMake对于这种情况是如何做的呢?只需要执行如下命令。
- 主目录CMakeLists.txt 中执行 add_subdirectory(子目录名)来添加子目录
- 主目录CMakeLists.txt 中执行 include_directories ("./math")来指定头文件搜索路径
- 主目录CMakeLists.txt 中执行 target_link_libraries(demo MathFun)来链接MathFun库
- 子目录CMakeLists.txt 中执行add_library来生成目标库
主目录下的 CMakeLists.txt
# CMake 最低版本号 cmake_minimum_required (VERSION 2.6) # 项目名称 project (CMakeTest) # 生成目标文件 add_executable (demo main.c) # 添加math子目录并执行他CMakeLists.txt add_subdirectory(math) # 指定头文件包含路径 include_directories ("./math") # 添加链接库 target_link_libraries(demo MathFun)
math目录下的 CMakeLists.txt
# CMake 最低版本号 cmake_minimum_required (VERSION 2.6) # 将本目录下的文件全部存入变量 DIR_LIB_SRCS 中 aux_source_directory(./ DIR_LIB_SRCS) # 生成链接库 参数是库名称 依赖文件 add_library (MathFun ${ DIR_LIB_SRCS})
math目录下的myadd.c
int MyAdd(int a,int b) { return a + b; }
main.c
#include<stdio.h> #include "myadd.h" int main() { int a = 10; int b = 20; int count = MyAdd(a,b); printf("%d + %d = %d ",a,b,count); return 0; }
项目结构
老规矩,来测试一下
下一篇:
Layui框架form模块的表单验证