浅学CMake

本文介绍了CMake的安装与使用,包括Linux下的安装步骤,CMake生成makefile的过程,以及通过实例解析单个和多个源文件的编译。此外,还涉及自定义编译选项、安装规则、测试、环境检查、添加版本号以及如何生成安装包等进阶操作。CMake作为一个跨平台的构建工具,简化了多平台的编译流程。
摘要由CSDN通过智能技术生成

      CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake不构建出最终的可执行文件,而是产生一个标准的建构档(即根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件),然后再依一般的建构方式使用,从而实现软件的跨平台。

<1>Linux下CMake的安装

先到官网下载CMake源码包:https://cmake.org/download/

打开终端依次执行以下命令:

tar -xzvf cmake-2.6.4.tar.gz
cd cmake-2.6.4
 ./bootstrap
make
make install

cmake 会默认安装在 /usr/local/bin 下面。(windows下安装可以直接下载安装包进行安装)

<2>Linux下使用CMake生成makefile & 编译的大致流程如下:

1.编写CMake的配置文件CMakeLists.txt(组态档的命名和类型必须为这个);

2.然后在终端输入CMake <PATH>(PATH是 CMakeLists.txt 所在的目录)或者CMake .(如果是在当前目录下,注意CMake和.之间有空格)来生成Makefile;

3.最后在终端输入make命令进行编译(windows平台下会生成VS的工程文件,可以使用VS工具进行编译)输出可执行文件。

以上就是CMake简单使用步骤,下面本文将会通过一些简单的例子来讲解CMake的一个基本使用。

<3>实例解析

主题一:单个源文件

假设现在我们有个源文件demo1.c,该程序实现对某个数求绝对值

#include <stdio.h>
#include <stdlib.h>

int abs(int num){
    return num>=0?num:-num;
}

void main(int argc, char* argv[]){
    int num = 0;
    if(argc < 2){
        printf("usage: %s number\n", argv[0]);
  }
    else{
        num = atoi(argv[1]);
        printf("abs(%d) = %d\n", num, abs(num));
  }
}

接着在demo1.c源文件的目录下,编写CMakeLists.txt

#CMake中#后面的语句解释为注释行
#指定cmake最低使用版本号,可以不设置,但是会有一个warnning cmake_minimum_required(VERSION
2.8) #设置项目工程的名称 project(Demo1) #将demo1.c源文件编译成一个名为Demo1的可执行文件 add_executable(Demo1 demo1.c)

然后在当前的目录下,输入cmake .命令生成makefile,最后再输入make命令(windows下使用VS打开.sln工程文件进行编译)来编译得到最后的可执行文件Demo1

[Tino@Tino-linux demo_test]$ cmake .
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/Tino/Documents/demo_test
[Tino@Tino-linux demo_test]$ make
Scanning dependencies of target Demo1
[ 50%] Building C object CMakeFiles/Demo1.dir/demo1.c.o
[100%] Linking C executable Demo1
[100%] Built target Demo1
[Tino@Tino-linux demo_test]$ ./Demo1 -5
abs(-5) = 5
[Tino@Tino-linux demo_test]$ 

主题二:多个源文件

(1)同一目录

假设现在我们把上面例子中的求绝对值abs单独编写一个另外一个源文件MyFunction.c中,如下形式(所有源文件都在同一目录demo_test下)

/demo_test
    demo2.c
    MyFunction.h
    MyFunction.c

此时的CMakeLists.txt应修改如下

cmake_minimum_required(VERSION 2.8)
project(Demo2)
add_executable(Demo2 demo2.c MyFunction.c)

相对于上例的CMakeLists.txt,只是在add_executable中多添加了一个源文件。这样写过固然没有问题,但是考虑到多文件的情况,我们这样手动的添加多个源文件是不是太麻烦了呢?是的,这个时候我们可以这样来添加文件

cmake_minimum_required(VERSION 2.8)
project(Demo2)
#该指令会查找所指定目录下(. 代表当前目录)的所有源文件
#并把文件名赋值给变量DIR_SOURCE
aux_source_directory(. DIR_SOURCE)
add_executable(Demo2 ${DIR_SOURCE})

这样就可以顺利编译出可执行文件了。

(2)不同目录

现在在demo_test目录下新建一个子目录math,将我们的MyFunction.h和MyFunction.c文件移动math文件里面。这种情况下,我们就必须要为每个源文件目录编写一个CMakeLists.txt。文件结构如下

/demo_test
    demo03
    /math
        MyFunction.h
        MyFunction.c

 

首先在子目录math里面,编写CMakeLists.txt

aux_source_directory(. DIR_LIB_SOURCE)
#将目录中的源文件编译为静态链接库
add_library(MyFunction ${DIR_LIB_SOURCE})

在根目录demo_test中的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Demo3)
aux_source_directory(. DIR_SOURCE)
#添加一个子目录math,这样子目录下的CMakeLists.txt也会被处理
add_subdirectory(math)
add_executable(Demo3 ${DIR_SOURCE})
#为可执行文件添加我们所需要的链接库MyFunction
target_link_libraries(Demo3 MyFunction)

接着我们再输入cmake命令:

[Tino@Tino-linux demo_test]$ cmake .
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/Tino/Documents/demo_test

这样根目录和子目录都会生成makefile,再make编译成可执行文件就可以了

[Tino@Tino-linux demo_test]$ make
Scanning dependencies of target MyFunction
[ 25%] Building C object math/CMakeFiles/MyFunction.dir/MyFunction.c.o
[ 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值