Makefile 是一种用于自动化编译和构建程序的工具,尤其在 C/C++ 项目中广泛使用。它通过定义规则(rules)来指定如何从**源代码**生成**目标文件**或**可执行文件**。
Makefile的核心格式为:
目标(target):依赖(dependencies)
命令(command)
在目录中创建makefile文件,示例如下:
hello:hello.c
gcc hello.c -o hello
此时我们目录中有.c文件hello.c:
此时我们可以直接输入make命令,使.c文件自动编译,效果如下:
如果有还不太了解gcc/g++编译器编译命令的可以先移步:[【Linux】手把手教你从零上手gcc/g++编译器](https://mfc1024.blog.csdn.net/article/details/141198721?spm=1001.2014.3001.5502)
变量可以简化重复内容(如编译器, 编译选项), 如:
CC = gcc
CFLAGS = -Wall
hello:hello.c
$(CC) $(CFLAGS) hello.c -o hello
运行展示如下:
$@
**:**当前目标名(如 app
)。$^
**:**所有依赖(如 main.c utils.c
)。$<
**:**第一个依赖(如 main.c
)。 示例如下:
hello:hello.c
gcc $^ -o $@
运行结果如下:
假设现在有两个程序一个服务器程序一个客户端程序需要一起编译生成并需要及时清理,那么makefile文件的编写参考:
.PHONY:all
all:server client
server:Server.cc
g++ -o $@ $^ -std=c++11
client:Client.cc
g++ -o $@ $^ -lpthread -std=c++11
.PHONY:clean
clean:
rm -f server client
更多Makefile相关内容可以查阅官方手册:[GNU Make 官方文档](https://www.gnu.org/software/make/manual/)
CMake 是一个**跨平台的自动化构建工具**,用于管理代码的编译、链接和安装流程。它通过生成标准的构建文件(如 Makefile、Visual Studio 项目、Ninja 文件等),简化了跨平台项目的构建过程。
CMakeLists.txt
生成 Makefile(或其他构建系统文件),无需手动处理底层编译细节。- 跨平台(Windows、Linux、macOS 等)。
- 支持复杂的项目结构(多目录、多库)。
- 自动管理依赖关系(如头文件、第三方库)。
1.编写CMakeLists.txt文件
每个项目目录都需要一个 **`CMakeLists.txt`**,定义构建规则。
示例如下:
cmake_minimum_required(VERSION 3.15) //最低CMake版本(不能比当前机器CMake版本高)
project(test) //项目名称
add_executable(hello hello.c) //生成可执行文件(参数是其依赖关系)
2.执行cmake命令生成makefile文件:
3.执行make命令生成可执行程序:
可以看到,我们直接执行cmake命令会生成大量的与程序本身无关的杂乱文件,这会干扰我们操作,所以我们可以通过以下步骤生成一下构建系统避免污染源代码:
1.创建构建目录(推荐 build
目录,避免污染源码):
mkdir build && cd build
2.运行cmake生成构建文件:
camke .. // 根据上级目录的 CMakeLists.txt 生成 Makefile
3.调用构建工具(如make或ninja)编译:
make #执行生成的Makefile
运行效果如下:
project(<PROJECT_NAME>)
: 定义项目名称和支持的语言(如 CXX
表示 C++)。add_executable(<target> <source_files>)
: 生成可执行文件。add_library(<target> <source_files>)
: 生成静态库(.a
/.lib
)或动态库(.so
/.dll
)。target_link_libraries(<target> <libraries>)
: 链接库到目标(可执行文件或库)。CMakeLists.txt
:
add_subdirectory(src) # 进入子目录 src add_subdirectory(libs) # 进入子目录 libsCMakeLists.txt
定义各自的构建规则。ccmake
:命令行交互界面,调整 CMake 变量。cmake-gui
:图形化界面,配置项目选项。CTest
:运行测试套件。CPack
:生成安装包(如 .deb
、.zip
)。希望这篇关于 快速上手Makefile & CMake 的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.
学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!
相关文章推荐