一、一个最简单的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]...)
但存在一些问题:
-
不会自动检测新增或删除的文件: 使用
file(GLOB ...)
时,CMake 不会自动检测源文件的变化,因此在添加或删除源文件时,需要手动重新运行 CMake。 -
不建议在大型项目中使用: 对于大型项目,由于可能包含大量的源文件,使用
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的使用