目录
- 1、Cmake简介
- 2、安装CMake
- 3、单目录简单实例
- 3.1、CMakeLists.txt
- 3.2、构建bulid
- 内部构建
- 外部构建
- 3.3、运行C语言程序
- 4、多目录文件简单实例
- 4.1、根目录CMakeLists.txt
- 4.2、源文件目录
- 4.3、utils.h
- 4.4、创建build
- 5、链接外部库文件
- 6、注意
1、Cmake简介
CMake是一个强大的跨平台构建工具,它能够自动生成用于构建项目的Makefile、Visual Studio项目文件或其他构建系统所需的文件。使用CMake,可以更轻松地管理复杂的C语言项目,使它们易于维护和跨平台。
如果对Makefile不了解可以看此文章→Makefile入门
2、安装CMake
首先,需要安装CMake。在Linux设备可以使用sudo apt-get install cmake。或者从CMake官网下载适合操作系统的安装程序。安装完成后,可以在终端中运行以下命令来检查CMake是否安装成功:
cmake --version
如果成功安装,将看到CMake的版本信息。
3、单目录简单实例
cmake的核心就是CMakeLists.txt
文件,(注意:CMakeLists.txt
文件名严格区分大小写,确保文件名准确无误)告诉CMake如何构建项目。一个工程目录下最简单需要编写一个CMakeLists.txt文件,然后创建build文件在此文件内进行 cmake . . && make编译此工程。如果多级目录,也可以使用多级CMakeLists.txt用于分开管理。以下是一个简单的示例:
3.1、CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
PROJECT (MyCProject)
# 设置编译选项,加入-g可以gdb调试
SET(CMAKE_CXX_FLAGS "-g")
SET(CMAKE_C_FLAGS "-g")
# 添加源文件
file(GLOB SOURCES "src/*.c")
# 添加头文件目录
#INCLUDE_DIRECTORIES(../include)
# 生成可执行文件
add_executable(src ${SOURCES})
以上的CMakeLists.txt
文件做了以下事情:
- CMakeLists.txt不区分函数名字大小写,一般一个函数都用大写或者都用小写
- #号用于注释语句
- 指定CMake的最低版本。
- 定义项目名称。
- 设置C语言标准。
- 使用
file()
函数将所有在src/
目录下的.c
文件赋给变量SOURCES
。- 使用
include_directories()
函数添加头文件目录。- 链接库文件路径LINK_LIBRARIES(xxx.a xx.a xxxx.a xxxxxx.so)
- 链接库文件LINK_DIRECTORIES(…/lib/csf …/build/certaut_zj …/build/xxx.a …/build/xxx.so)
- 最后,使用
add_executable()
函数生成可执行文件,将源文件${SOURCES}
执行生成src可执行程序。- 此外还可以生成库文件 ADD_LIBRARY(xxx STATIC ${SRC_LIST})生成静态库文件xxx.a
- 生成动态库 ADD_LIBRARY(xxx SHARED ${SRC_LIST})生成动态库文件xxx.so
3.2、构建bulid
内部构建
直接在项目目录下进行cmake . 和 make ,这会导致出现很多临时文件,很不友好和美观
外部构建
在项目根目录 新建build文件 在此文件中进行cmake … 和make,隐藏不不要的临时文件,便于其他操作。
例如:在项目根目录下创建一个build/
文件夹,并在终端中进入该文件夹。然后运行以下命令:
cmake ..
这将使用根目录中的CMakeLists.txt
文件来配置项目。接下来,运行以下命令来编译项目:
make
这将生成可执行文件MyCProject
,可以在build/
目录下找到它。
3.3、运行C语言程序
现在,可以在终端中运行的C语言程序:
./src
C语言程序应该正常运行了。
4、多目录文件简单实例
test-2/CMakeLists.txtsrc/CMakeLists.txtmain.cutils.cinclude/utils.hbuild/
CMakeLists.txt
是CMake的配置文件,用于告诉CMake如何构建项目。
-此工程为多个CMakeLists.txt文件,每个CMakeLists.txt文件管理此目录下的源文件,并且上级CMakeLists.txt可以递归管理子目录src/
包含的C源代码文件。include/
包含的头文件。build/
是构建输出目录,用于存放生成的可执行文件和中间文件,可以按照自己的需求删除和手动创建。
4.1、根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.16)PROJECT (ZPJ_TEST_1)SET(CMAKE_CXX_FLAGS "-g")
SET(CMAKE_C_FLAGS "-g")ADD_SUBDIRECTORY(./src ./bin)
ADD_SUBDIRECTORY(./src ./bin)
将src路径下的CMakeLists.txt进行处理,并且将处理的结果放在bin下,如果是在build目录下cmake的,那么结果就会在build/bin/下
此语句可指定子目录的 相对路径或绝对路径,可省略bin文件,默认生成子目录同名文件放入生成的文件
4.2、源文件目录
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)file(GLOB SRC_LIST "./*.c")
include_directories(../include)ADD_EXECUTABLE(src ${SRC_LIST})
src/main.c
#include <stdio.h>
#include "utils.h"int main() {printf("Hello, CMake!\n");int result = add(2, 3);printf("2 + 3 = %d\n", result);return 0;
}
src/utils.c
#include "utils.h"int add(int a, int b) {return a + b;
}
4.3、utils.h
#ifndef UTILS_H
#define UTILS_Hint add(int a, int b);#endif
4.4、创建build
运行cmake … 和 make命令,将成功构建多文件C语言项目。
5、链接外部库文件
把上述例子目录结构改变为
然后更改每个CMakeLists.txt文件
按上图顺序依次为
根目录
cmake_minimum_required(VERSION 3.16)PROJECT (ZPJ_TEST_1)SET(CMAKE_CXX_FLAGS "-g")
SET(CMAKE_C_FLAGS "-g")ADD_SUBDIRECTORY(./utils/ ./utils/)
ADD_SUBDIRECTORY(./src ./bin)
src
cmake_minimum_required(VERSION 3.16)file(GLOB SRC_LIST "./*.c")
include_directories(../include)
LINK_DIRECTORIES( ../build/utils)
LINK_LIBRARIES(utils.so)
ADD_EXECUTABLE(src ${SRC_LIST})
utils
cmake_minimum_required(VERSION 3.16)file(GLOB SRC_LIST "./*.c")
include_directories(../include)ADD_LIBRARY(utils SHARED ${SRC_LIST})
此为删减版build目录结构
最后运行src
6、注意
不一定每个目录里都要有CMakeLists.txt文件,只要CMakeLists.txt里的各个路径引用正确即可
CMakeLists.txt中还有许多函数和宏,在大型项目组十分常见,可以自行查找,本文不再加以赘述。