CMake基础入门教程 (一)


CMake作为一款跨平台编译工具,很好解决了不同平台编译标准不一致的问题,学习CMake的意义就在于,它可以让开发者编写一种与平台无关的CMake配置件来定制整个编译流程,使开发者不需要考虑各平台互不兼容的问题。


前言

  1. 在每个需要编译的目录下都要有一个 CMakeLists.txt 配置文件以便CMake执行
  2. CMake语法中不区分大小写,语法注释使用 #
  3. CMake语法有点像Shell,都是通过 ${变量名} 取变量值

从一个最简单的例子认识它

一个最基本的 CMakeLists.txt 应该是这样

# CMake 最低版本号
cmake_minimum_required (version 2.6)
# 项目名称
project (CMakeTest)
# 生成目标文件
add_executable (demo main.c)
  1. cmake_minimum_required :来指定此CMake运行的最低版本。
  2. project:指定项目的名称,CMake会将这个名称赋值给CMake内部的一个变量,这个之后讲。
  3. 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对于这种情况是如何做的呢?只需要执行如下命令。

  1. 主目录CMakeLists.txt 中执行 add_subdirectory(子目录名)来添加子目录
  2. 主目录CMakeLists.txt 中执行 include_directories ("./math")来指定头文件搜索路径
  3. 主目录CMakeLists.txt 中执行 target_link_libraries(demo MathFun)来链接MathFun库
  4. 子目录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;
}

项目结构


老规矩,来测试一下


经验分享 程序员 微信小程序 职场和发展