前言:
CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。
本文主要讲述在Linux下如何使用CMake来编译我们的程序。
- CmakeLists.txt->makefile->make就可以了,使用Cmake自动生成makefile
- Cmake可以生成可执行文件,也可以生成库文件(动态库、静态库等)
1.cmake的环境搭建
使用的是ubuntu18.04,安装cmake使用如下命令:
sudo apt install cmake
安装完成后,在终端下输入:
cmake -version
%查看cmake的版本
1.1 cmake的demo
首先让我们从最简单的代码入手,来体验下cmake是如何操作的。
add.cc
#include "head.hpp"
int add(int a, int b)
{
return a + b;
}
head.hpp
#pragma once
int add(int a, int b);
main.cc
#include <iostream>
#include "head.hpp"
int main()
{
int a = 10;
int b = 20;
std::cout << add(a, b) << std::endl;
return 0;
}
在main.c的同级目录下,创建一个CMakeLists.txt,内容如下:
CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (demo)
add_executable(main main.c)
解释:
- 第一句是指定要使用的cmake的最低版本,如果本地的cmake版本不符合要求,就不能完成cmake编译,这个可以不写,但是写上是一个良好的习惯,避免一些潜在问题。
- 第二句就是项目的名字,定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。
# PROJECT 指令的语法是:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
add_executable:定义工程会生成一个可执行程序
add_executable(可执行程序名 源文件名称)
%中间可以用空格分开,也可以用;来分开
使用cmake编译:
在终端下切到main.c所在的目录下,然后输入以下命令运行cmake:
cmake .
可以看到在目录下,生成的文件有哪些?
在当前目录下面用cmake编译,所有东西包括可执行,都会堆到一个目录下,很乱,所以我们一般现在当前目录下创建一个build目录,然后在里面cmake…
1.2 编译多个源文件
1.2.1 在同一个目录下有多个源文件
首先删除之前的文件:
rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile main
%在之前的目录下添加2个文件,testFunc.c和testFunc.h
touch testFunc.c testFunc.h
testFunc.c
#include <stdio.h>
#include "testFunc.h"
void func(int data)
{
printf("data is %d\n", data);
}
testFunc.h
#ifndef _TEST_FUNC_H_
#define _TEST_FUNC_H_
void func(int data);
#endif
main.c
#include <stdio.h>
#include "testFunc.h"
int main(void)
{
func(100);
return 0;
}
CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (demo)
add_executable(main main.c testFunc.c)
%修改CMakeLists.txt,在add_executable的参数里把testFunc.c加进来
运行查看:
cmake .
make
注意:
- 可以类推,如果在同一目录下有多个源文件,只要在add_executable里把所有源文件都添加进去就可以了
但是如果有一百个源文件,再这样做就有点坑了,无法体现cmake的优越性。
因此cmake提供了一个命令,可以把指定目录下所有的源文件存储在一个变量中,这个命令就是
aux_source_directory(dir var)
参数1:dir是指定目录,
参数2:var是用于存放源文件列表的变量。
接下来写个进阶版的demo使用一下这个变量。
进阶版本CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (demo)
%使用aux_source_directory把当前目录下的源文件存列表存放到变量SRC_LIST里
aux_source_directory(. SRC_LIST)
add_executable(main ${
SRC_LIST})
aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下:
cmake_minimum_required (VERSION 2.8)
project (demo)
set( SRC_LIST
./main.c
./testFunc1.c
./testFunc.c)
add_executable(main ${
SRC_LIST})