0

0

C++ makefile怎么写 C++ Linux项目编译Makefile编写入门【构建】

尼克

尼克

发布时间:2026-02-01 19:49:19

|

869人浏览过

|

来源于php中文网

原创

最小可用Makefile仅需三行:目标、依赖、命令,如app: main.o;main.o: main.cpp;g++ -c main.cpp,且缩进必须用Tab而非空格。

c++ makefile怎么写 c++ linux项目编译makefile编写入门【构建】

Makefile 最小可用结构长什么样

一个能跑起来的 C++ Makefile,核心就三行:目标、依赖、命令。没有花哨语法也能编译单个源文件。

比如项目只有一个 main.cpp,想生成可执行文件 app,直接写:

app: main.o
    g++ -o app main.o

main.o: main.cpp g++ -c main.cpp

注意缩进必须是 Tab 字符,不能用空格——这是 GNU Make 的硬性要求,否则报错 Makefile:2: *** missing separator. Stop.

常见误区是复制粘贴时把 Tab 变成空格,编辑器要设为显示不可见字符来确认。

立即学习C++免费学习笔记(深入)”;

怎么自动处理多个 .cpp 文件和头文件依赖

手写每个 .o 规则太累,而且改了头文件不会自动重编——g++ -M 是解法。

用变量和模式规则让 Makefile 可扩展:

CC = g++
CFLAGS = -std=c++17 -Wall -I./include
SRCS = $(wildcard src/*.cpp)
OBJS = $(SRCS:.cpp=.o)
DEPS = $(SRCS:.cpp=.d)

app: $(OBJS) $(CC) -o $@ $^

%.o: %.cpp $(CC) $(CFLAGS) -c $< -o $@

-include $(DEPS)

%.d: %.cpp $(CC) $(CFLAGS) -MM $< > $@.$$$$; \ sed 's,($).o[ :],\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$

-include $(DEPS) 让 Make 尝试加载自动生成的依赖文件(如 main.d),即使还没生成也不报错;sed 那行是为了把 main.o: main.cpp a.h 改成 main.o main.d: main.cpp a.h,确保改头文件后 .o.d 一起重建。

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

下载

不加这步,改了 a.hmake 可能完全不重新编译,导致静默错误。

clean、install、debug 这些伪目标怎么加才不踩坑

伪目标(phony target)必须显式声明,否则当目录下真有叫 clean 的文件时,Make 会跳过执行。

  • .PHONY: clean install debug 必须写在最前面或逻辑清晰的位置
  • clean 命令里用 -rm(开头加短横)忽略“文件不存在”错误,避免中断
  • install 如果要复制到系统路径(如 /usr/local/bin),记得加 sudo 提示或检查权限,别默认假设用户有 root

示例片段:

.PHONY: clean debug install

clean: -rm -f app $(OBJS) $(DEPS)

debug: $(MAKE) CFLAGS="$(CFLAGS) -g -O0"

install: cp app /usr/local/bin/

注意 debug 里用了 $(MAKE) 而不是直接调 make,这是递归调用的安全写法,能继承当前 Make 的所有环境和参数。

为什么改了头文件有时还是不重编?关键在依赖生成时机

依赖文件(.d)只在第一次编译或对应源文件变动时生成。如果删了 .d 文件但没动 .cpp,Make 不知道该不该重生成它,就会漏掉头文件变化。

更稳健的做法是在 clean 里删掉 .d,并在主目标里加一条强制更新依赖的逻辑:

app: $(OBJS) $(DEPS)
    $(CC) -o $@ $^

同时确保 %.d 规则在 %.o 之前定义(Make 按顺序解析,先匹配到的规则优先)。否则可能 .o 先生成了,.d 还没来得及建,后续依赖就失效。

这不是理论问题——实际项目里,协作时有人手动删了中间文件、CI 环境清理不彻底、或者 IDE 和 Makefile 混用,都容易触发这类隐性编译错误

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1416

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

707

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

296

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

782

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

575

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

550

2023.07.20

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

300

2023.07.20

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

384

2023.07.25

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号