前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Linux】快速上手Makeflie & CMake

【Linux】快速上手Makeflie & CMake

作者头像
修修修也
发布2025-03-21 08:38:45
发布2025-03-21 08:38:45
10900
代码可运行
举报
运行总次数:0
代码可运行

快速上手Makefile

Makefile 是一种用于自动化编译和构建程序的工具,尤其在 C/C++ 项目中广泛使用。它通过定义规则(rules)来指定如何从**源代码**生成**目标文件**或**可执行文件**。

基本结构

代码语言:txt
复制
    Makefile的核心格式为:
代码语言:javascript
代码运行次数:0
运行
复制
目标(target):依赖(dependencies)
    命令(command)
  • 目标(target): 通常是生成的文件名(如main.o或main)。
  • 依赖(dependencies): 生成目标所需的文件(如main.c或main.o文件)。
  • 命令(command): 生成目标的Shell命令(以Tab开头)。
代码语言:txt
复制
    在目录中创建makefile文件,示例如下:
代码语言:javascript
代码运行次数:0
运行
复制
hello:hello.c
    gcc hello.c -o hello
代码语言:txt
复制
    此时我们目录中有.c文件hello.c:
代码语言:txt
复制
    此时我们可以直接输入make命令,使.c文件自动编译,效果如下:
代码语言:txt
复制
    如果有还不太了解gcc/g++编译器编译命令的可以先移步:[【Linux】手把手教你从零上手gcc/g++编译器](https://mfc1024.blog.csdn.net/article/details/141198721?spm=1001.2014.3001.5502)

变量

代码语言:txt
复制
    变量可以简化重复内容(如编译器, 编译选项), 如:
代码语言:javascript
代码运行次数:0
运行
复制
CC = gcc
CFLAGS = -Wall

hello:hello.c
	$(CC) $(CFLAGS) hello.c -o hello
代码语言:txt
复制
    运行展示如下:

自动变量

  • $@**:**当前目标名(如 app)。
  • $^**:**所有依赖(如 main.c utils.c)。
  • $<**:**第一个依赖(如 main.c)。
代码语言:txt
复制
    示例如下:
代码语言:javascript
代码运行次数:0
运行
复制
hello:hello.c
    gcc $^ -o $@
代码语言:txt
复制
    运行结果如下:

常用目标

  • all: 默认目标,通常编译所有内容
  • clean: 清理生成的文件
  • .PHONY: 声明伪目标(不生成文件)
代码语言:txt
复制
    假设现在有两个程序一个服务器程序一个客户端程序需要一起编译生成并需要及时清理,那么makefile文件的编写参考:
代码语言:javascript
代码运行次数:0
运行
复制
.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

CMake 是一个**跨平台的自动化构建工具**,用于管理代码的编译、链接和安装流程。它通过生成标准的构建文件(如 Makefile、Visual Studio 项目、Ninja 文件等),简化了跨平台项目的构建过程。

CMake与Makefile的关系

  • Makefile:需要手动编写规则,直接调用编译器。
  • CMake:通过高级的配置文件 CMakeLists.txt 生成 Makefile(或其他构建系统文件),无需手动处理底层编译细节。
  • 优势
代码语言:txt
复制
-  跨平台(Windows、Linux、macOS 等)。
代码语言:txt
复制
-  支持复杂的项目结构(多目录、多库)。
代码语言:txt
复制
-  自动管理依赖关系(如头文件、第三方库)。

CMake的使用步骤

1.编写CMakeLists.txt文件

代码语言:txt
复制
    每个项目目录都需要一个 **`CMakeLists.txt`**,定义构建规则。
代码语言:txt
复制
    示例如下:
代码语言:javascript
代码运行次数:0
运行
复制
cmake_minimum_required(VERSION 3.15)  //最低CMake版本(不能比当前机器CMake版本高)
project(test)                         //项目名称
add_executable(hello hello.c)         //生成可执行文件(参数是其依赖关系)

2.执行cmake命令生成makefile文件:

3.执行make命令生成可执行程序:

代码语言:txt
复制
    可以看到,我们直接执行cmake命令会生成大量的与程序本身无关的杂乱文件,这会干扰我们操作,所以我们可以通过以下步骤生成一下构建系统避免污染源代码:

1.创建构建目录(推荐 build 目录,避免污染源码):

代码语言:javascript
代码运行次数:0
运行
复制
mkdir build && cd build

2.运行cmake生成构建文件:

代码语言:javascript
代码运行次数:0
运行
复制
camke .. // 根据上级目录的 CMakeLists.txt 生成 Makefile

3.调用构建工具(如make或ninja)编译:

代码语言:javascript
代码运行次数:0
运行
复制
make #执行生成的Makefile
代码语言:txt
复制
    运行效果如下:

常用命令

(1) 基本配置
  • project(<PROJECT_NAME>): 定义项目名称和支持的语言(如 CXX 表示 C++)。
  • add_executable(<target> <source_files>): 生成可执行文件。
  • add_library(<target> <source_files>): 生成静态库(.a/.lib)或动态库(.so/.dll)。
  • target_link_libraries(<target> <libraries>): 链接库到目标(可执行文件或库)。
(2) 变量与选项
  • 定义变量: set(SRC_FILES main.cpp utils.cpp) add_executable(my_app ${SRC_FILES})
  • 条件判断: if(WIN32) # Windows 平台特定配置 endif()
(3) 查找依赖
  • 查找系统已安装的库: find_package(OpenCV REQUIRED) target_link_libraries(my_app ${OpenCV_LIBS})
  • 自定义库路径: set(OPENCV_DIR "/path/to/opencv") find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR})

高级功能

(1) 多目录项目
  • 主目录CMakeLists.txt: add_subdirectory(src) # 进入子目录 src add_subdirectory(libs) # 进入子目录 libs
  • 子目录CMakeLists.txt 定义各自的构建规则。
(2) 安装与打包
  • 定义安装规则: install(TARGETS my_app DESTINATION bin) # 安装可执行文件到 bin 目录 install(FILES include/utils.h DESTINATION include) # 安装头文件
  • 生成安装包: include(InstallRequiredSystemLibraries) set(CPACK_PACKAGE_NAME "MyApp") include(CPack)
(3) 测试支持
  • 启用测试: enable_testing() add_test(NAME my_test COMMAND my_app --test)

常用工具

  • ccmake:命令行交互界面,调整 CMake 变量。
  • cmake-gui:图形化界面,配置项目选项。
  • CTest:运行测试套件。
  • CPack:生成安装包(如 .deb.zip)。

结语

希望这篇关于 快速上手Makefile & CMake 的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【Linux】手把手教你从零上手Vim编辑器

【Linux】手把手教你从零上手gcc/g++编译器

【Linux】实现一个简易的shell命令行

【Linux】基本指令(下)

【Linux】基本指令(中)

【Linux】基本指令(上)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 快速上手Makefile
    • 基本结构
    • 变量
    • 自动变量
    • 常用目标
  • 快速上手CMake
    • CMake与Makefile的关系
    • CMake的使用步骤
    • 常用命令
    • 高级功能
    • 常用工具
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档