cmake门口观望篇-单文件编译

    从hello world开始,逐步学习cmake。本文主要讲cmake的set和add_executable指令以及内部构建和外部构建

cmake是makefile的上层构建工具,它并不直接编译构建整个工程,而是用于构建可移植的makefile或是 Windows 的 VS 工程文件,并简化自己动手写makefile时的巨大工作量。手动写makefile往往依赖于当前编译平台,而且编写makefile的工作量比较大,解决依赖往往会让你头皮发麻。因此,对于较大项目,应当考虑使用更自动化一些的 cmake或者autotools等工具来生成makefile,而不是上来就动手编写。


目录

1 Hello CMake

2 说明与完善

3 构建文件与源文件分离--外部构建


1 Hello CMake

    从经典程序Hello wold开始

main.cpp

#include<stdio.h>
int main()
{
    printf("Hello CMake \n");
}

CmakeLists.txt

add_executable(camektest main.c)

    目录结构

.
├── CMakeLists.txt
└── main.c

在代码路径下开始构建(内部构建),执行cmake ./  

cmake ./

等待片刻,在工程目录下将生成编译使用的MakeFile以及其他cmake配置文件

dawn@DAWN-AMD:~/workstation/cmaketest$ ls
CMakeCache.txt  CMakeFiles  CMakeLists.txt  Makefile  cmake_install.cmake  main.c

此时执行make即可编译main.c

dawn@DAWN-AMD:~/workstation/cmaketest$ ls
CMakeCache.txt  CMakeFiles  CMakeLists.txt  Makefile cmake_install.cmake  cmaketest  main.c
dawn@DAWN-AMD:~/workstation/cmaketest$ ./camektest
Hello CMake

2 说明与完善

CMakeLists.txt是 cmake 的构建定义文件,文件名严格区分大小写,大小写不一致不生效,执行时会报错The source directory xxx does not appea,如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt。(关于多目录构建,后面继续学习)。另外cmake语法不严格区分大小写,即CMakeLists.txt文件内变量或指令不区分大小写,可以大小写混搭,add_executable(camektest main.c)写成Add_ExecuTablE(camektest main.c)也是可以的, 当然,建议根据自己喜好使用统一风格

下面对add_executable指令进行说明,

基本语法

add_executable(hello ${src_list})

使用src_list中的源文件,生成可执行文件hello,所以采用变量形式,我们的例子可以写成

set(src_list main.c)
add_executable(hello ${src_list})

set指令的语法 :

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) 
指令功能: 用来显式的定义变量                            
例子: set(src_list main.c other.c) 
说明: 用变量代替值,例子中定义src_list代替后面的字符串。

当然,一般cmake会在开头加上如下内容

#设置cmake最低版本,构建环境低于设置版本时,执行cmake将报错并终止构建
cmake_minimum_required(VERSION 3.6.0)
#指定项目名称
project(Main)

3 构建文件与源文件分离--外部构建

上面的方法产生的构建文件直接生成在源文件目录,两者混在一起,不够简洁美观,下面使用外部构建,将两者分离开。

外部构建的方法也挺简单的,执行cmake的时候我们需要添加一个参数,即需要构建的目录,而生成的构建文件则放在执行cmake的当前目录,那我们只需要单独创建一个目录,再cd到新建目录执行cmake并指定需要构建的目录即可让源文件与构建文件分离,如下所示

dawn@DAWN-AMD:~/workstation/cmaketest$ tree
.
├── CMakeLists.txt
└── main.c
dawn@DAWN-AMD:~/workstation/cmaketest$ mkdir build && cd build
dawn@DAWN-AMD:~/workstation/cmaketest/build$ cmake ../
dawn@DAWN-AMD:~/workstation/cmaketest/build$ cd ..
dawn@DAWN-AMD:~/workstation/cmaketest$ tree -L 2
.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   └── cmake_install.cmake
└── main.c

这样就可以让编译文件与源文件分隔开,不仅让源文件目录看起来整洁,而且想要恢复源文件直接删掉build目录就可以了,仔细观察你会发现,无论是内部构建还是外部构建,默认构建生成的最终可执行文件都在执行cmake时所在目录,当然这个是可以在CMakeLists.txt里指定的,我们后面继续学习

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值