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模块的表单验证
