CMake的简单使用

一、一个最简单的CMake项目

在Ubuntu上使用CMake构建一个最简单的项目。

1. 安装CMake

首先安装CMake,这里使用的是Ubuntu系统。

sudo apt-get install cmake

2. 编写源程序

编写代码,新建文件main.c。

// main.c
#include "stdio.h"
 
int main(void)
{
    printf("Hello World!\r\n");
    return 0;
}

3. 编写CMake文件

在同一个目录下编写CMake文件,名字必须CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

project(demo)

add_executable(hello main.c)

project关键字指定了工程的名字。
add_executable关键字用来生成可执行文件。其中,hello用来指定生成的可执行文件的文件名,main.c指定编译的源文件。

4. 编译

编写完成后,在CMake当前目录下执行

cmake .


但是这样会在当前目录下生成很多中间文件,很难清理。

可以使用下面的指令,让所有中间文件都生成到build目录下。

cmake . -B build

清理中间文件的时候直接rm -rf build即可。
build目录下会有一个生成的Makefile文件,在该目录下make进行编译。

也可以在源代码的目录下面的cmake指令代替make指令进行编译。

cmake --build build


build目录下生成可执行文件hello,直接./hello执行。

二、CMake语法

file(GLOB …)

file (GLOB ...)命令用于获取指定模式的文件列表,一种常见的用法是用来收集指定格式的源文件列表,基本语法为

file(GLOB variable [LIST_DIRECTORIES true|false] [RELATIVE path] [CONFIGURE_DEPENDS] [globbingexpressions]...)

但存在一些问题:

  1. 不会自动检测新增或删除的文件: 使用file(GLOB ...)时,CMake 不会自动检测源文件的变化,因此在添加或删除源文件时,需要手动重新运行 CMake。

  2. 不建议在大型项目中使用: 对于大型项目,由于可能包含大量的源文件,使用file(GLOB ...)可能会导致性能问题。
    在大型项目中,推荐使用显式地列出所有源文件的方式,例如

set(SOURCES
    src/file1.cpp
    src/file2.cpp
    src/file3.cpp
    # ...
    src/main.cpp
)

add_executable(my_executable ${SOURCES})

include_directories

include_directories用来在构建中添加包含的目录。其格式为

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

例如,如果main.c文件想直接引入另一个路径下的头文件,则将头文件a.h,则将a.h的相对路径放在include_directories列表中,main.c中直接#include "a.h"即可,而不需写成#include “/path/to/a.h”

举例

目录结构构建如下

├── CMakeLists.txt		#最外层的CMakeList.txt
├── source				#源文件目录
│     └── main.c		#源文件
└── include				#子目录
      └── a.h			#头文件

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

project (demo)

file (GLOB srcfiles source/*.c) # 将所有source目录下的.c文件加入名为srcfiles的文件列表
include_directories(./include/) # 将所有include目录下的文件加入构建

add_executable(hello ${srcfiles})

main.c

#include "stdio.h"
#include "a.h" // 直接引用a.h,不需要加相对路径

int main(void)
{
    printf("%d\n", TEST_MARCO);
    return 0;
}

a.h

#ifndef __A_H__
#define __A_H__
#define TEST_MARCO 10
#endif /* __A_H__ */

构建并运行项目

cmake . -B build
cmake --build build
./build/hello

得到的输出:10

参考文章:
【CMake】简单学习
CMake使用file(GLOB …)需要注意的问题
CMake中include_directories的使用

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值