Linux系统中cmake的使用

前言

  在Linux系统如Ubuntu下做C语言编程常见的操作是:写好代码,然后使用gcc指令对程序预处理-编译-汇编-链接(其实只用一条指令:gcc -o)。这样的方法只适合单文件无文件组织的简单工程。当工程中代码文件增加且拥有组织结构之后,无可避免就需要去写makefile。本人之前写makefile,头皮发麻,如今赶紧转正,投向Cmake。
  Cmake可以根据工程中CMakeLists.txt的指令自动生成makefile,相对方便易于上手。

准备工作

  在Ubuntu下安装cmake:

sudo apt install cmake

  安装完毕后查看cmake的版本:

cmake --version

在这里插入图片描述

  可见当前版本是3.5.1,安装完毕。

单文件工程中使用cmake

  新建一个文件夹存放工程,新建一个main.c。内部代码如下:

#include <stdio.h>

int main() {
    printf("hello world!\n");
    return 0;
}

  显然是个hello world,程序不重要,接下来在同目录下新建一个CMakeLists.txt。内容如下:

cmake_minimum_required(VERSION 2.8)#cmake最低版本为2.8
project(demo)#工程名
add_executable(main main.c)#生成elf文件名为main,源文件为main.c

  由于没有文件组织,因此内容较为简单。第一句指令为限定cmake的最低版本为2.8(本机上cmake版本为3.5.1)。第二句指令为该工程的名称。第三句指令为工程最终生成的可执行文件名称为main,参与编译的源代码文件为main.c。
在这里插入图片描述

  如上图所示,工程就准备好了。接下来开始编译生成可执行文件。在工程目录处打开终端。输入:

cmake .

  输入后按回车执行。这里要注意指令中cmake后面有一个“.”,单点号意为“当前目录下”。多文件组织时由于存在子目录所以是两个.,这个后面还会提到,先提前注意。
在这里插入图片描述

  执行完cmake后如上图所示,生成了一些包含makefile在内的文件。除了makefile之外都是cmake产生的一些中间文件。
  随后在命令行敲入make正式执行makefile:

make

在这里插入图片描述
  可见目录中出现了可执行文件,名称为main。敲命令行来执行它:

./main

在这里插入图片描述

  执行成功了。如果程序有修改,则可以使用命令make clean删除可执行文件,再使用命令make重新编译生成可执行文件。

多文件工程中使用cmake

  一个多文件的工程往往是这样组织的:
在这里插入图片描述
  文件夹bin:用于存放生成的可执行文件。
  文件夹build:用于存放生成的中间文件。
  文件夹includes:用于存放所有的头文件。
  文件夹sources:用于存放所有的源文件(.c)。
  cmakelists.txt:用于控制全工程的makefile生成。
在这里插入图片描述
  这里为了测试,在工程中添加两个头文件,三个c文件。存放目录如上图所示。
  func1.c代码如下:

#include "func1.h"
#include <stdio.h>

void DataShow(int data)
{
    printf("the input data is:%d \n",data);//打印一个数字
}

  func1.h代码如下:

#ifndef  _FUNC1_H_
#define _FUNC1_H_
extern void DataShow(int data);
#endif 

  func2.c代码如下:

#include <stdio.h>
#include "func2.h"

void DataAdd(int a,int b)//打印两个数字之和
{
    int c = a+b;
    printf("the number is:%d\n",c);
}

  func2.h代码如下:

#ifndef _FUNC2_H_
#define _FUNC2_H_
extern void DataAdd(int a,int b);

#endif // !_FUNC2_H_

  main.c代码如下:

#include <stdio.h>
#include "func1.h"
#include "func2.h"
int main(void)
{
    DataAdd(2,2);//打印两个数字之和
    printf("data is:%d\n",5);//打印5
    DataShow(5);//打印一个数字
    return 0;
}

  cmakelists.txt内容如下:

cmake_minimum_required(VERSION 2.8)#cmake最低版本为2.8
project(demo)#项目名称
aux_source_directory(sources SRC_LIST)#将源文件夹中的源文件集合定义为变量
include_directories(includes)#添加头文件路径
add_executable(main ${SRC_LIST})#生成elf文件名为main,源文件在源文件夹中
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#将工程根目录下的bin文件夹作为输出

  命令的前两句不谈了,和之前的一样。
  命令第三句aux_source_directory(sources SRC_LIST)意为将sources文件夹里面的文件集合定义成一个变量,该变量叫SRC_LIST。今后调用这个变量即为调用所有sources文件夹里的源文件。
  命令第四句include_directories(includes)意为将includes文件夹中的头文件添加到工程中。
  命令第五句本质和单文件工程中的一样。生成可执行文件的名称为main,源文件是变量SRC_LIST,即sources文件夹中所有的源文件。这里还需要稍微注意一下,${SRC_LIST}SRC_LIST是个变量,而不是参量,格式需要注意。
  命令第六句意为将输出的可执行文件定位到工程根目录下的bin文件夹。参量EXECUTABLE_OUTPUT_PATH、变量PROJECT_SOURCE_DIR都是cmake中的预设量,分别意为“可执行文件保存的路径”,“工程的根目录”。
  接下来我们需要到build文件夹中执行cmake指令。这样就可以使得生成的中间文件都保存在build文件夹中。
  输入指令:

cmake ..

  由上文可知,由于该工程拥有2级目录因此需要两个点号
在这里插入图片描述  如上图所示,cmake完毕后生成一个makefile,随后在命令行中进行编译:

make

  注意编译指令也是在build文件夹执行的,因为makefile在build文件夹中。
在这里插入图片描述

  由上图可见,在bin文件夹下生成了可执行文件main。老办法,执行它。
在这里插入图片描述
  看到结果,舒服了。

发布了39 篇原创文章 · 获赞 12 · 访问量 4461

猜你喜欢

转载自blog.csdn.net/m0_37872216/article/details/103931530