makefile中需显式定义c++编译规则,如%.o: %.cpp并用g++ -c $
Makefile 里怎么写 C++ 编译规则
直接写
g++命令就行,但得把源文件、目标文件、依赖关系和编译选项串对。别指望 Make 自动识别.cpp文件该用什么命令——它默认只认.c和cc,C++ 必须显式定义规则。常见错误现象:
make: *** No rule to make target 'main.o', needed by 'app'. Stop.,本质是没告诉 Make 如何把main.cpp变成main.o。
- 必须加一条模式规则:
%.o: %.cpp,后面跟g++ -c $$ 是第一个依赖(即 <code>.cpp文件),$@是目标(即.o文件),别手滑写成$*或漏掉-c- 如果用了 C++17 特性,记得在编译选项里加
-std=c++17,否则默认可能是 C++98,报错像error: 'optional' is not a member of 'std'头文件修改后不重新编译?检查依赖生成方式
手动写
main.o: main.cpp utils.h看似稳妥,但工程一多就崩——你根本记不住谁 include 了谁。Makefile 本身不解析#include,得靠编译器帮我们生成依赖项。使用场景:改了
vector<string></string>相关逻辑,结果make说“全是最新”,运行却崩,大概率是头文件变更没触发重编译。立即学习“C++免费学习笔记(深入)”;
- 在编译
.o时加-MMD -MP:前者生成.d依赖文件,后者让 Make 能安全处理头文件被删的情况- 在 Makefile 开头加
-include *.d,让 Make 读取这些自动生成的依赖- 别用
-MM(它忽略系统头文件)或漏掉-MP,否则删掉某个头文件后可能报No rule to make target 'xxx.h'如何避免反复链接整个工程
链接阶段最慢,所以得确保只在必要时才执行
g++ -o app main.o util.o。核心是让可执行文件明确依赖所有.o,且每个.o又依赖自己的源和头文件。性能影响:如果写成
app: *.cpp,每次make都会重新编译全部源文件,哪怕只改了一行注释。
- 目标写成
app: main.o util.o,不是app: *.o—— 后者在空目录下会让 Make 报*** No rule to make target '*.o'- 如果用
$(wildcard *.o),确保先有.o文件再运行 make,否则变量展开为空,链接命令直接失效- 加
-Wall -Wextra到链接命令里没意义,那是编译阶段的选项;链接时加-static-libstdc++才能避免运行时缺 libstdc++.so跨平台或换编译器时容易栽在哪
Linux 下用
g++写的 Makefile,在 macOS 上跑clang++可能卡在-fPIC或std=c++17写法差异上;Windows 的 MinGW 甚至不认rm -f。兼容性影响:一个
CXX = g++看似简单,但没设CXXFLAGS和LDFLAGS分离,后期切 clang 就得全局搜替换。
- 开头定义
CXX ?= g++,问号表示“只在没设置时才赋值”,方便外部传参:make CXX=clang++- 删除命令统一用
$(RM),并在开头写RM = rm -f;Windows 用户可改RM = del /f(但更建议用 WSL)- 别硬编码路径如
/usr/local/include/boost,用-I$(BOOST_INC),通过make BOOST_INC=/opt/boost/include注入最容易被忽略的是:Make 对 Tab 键极其敏感,任何命令行前混入空格都会报
Makefile:5: *** missing separator,而且这个错误不会告诉你哪一行——得逐行检查缩进。
0
0
相关文章
C++ 怎么求int的平方根 C++ sqrt函数处理整数【示例】
C++怎么转换字符 C++大小写字母转换方法【必备】
C++中如何通过__builtin_prefetch加速深度优先搜索算法?(缓存局部性优化)
C++中std::format怎么格式化字符串_C++20文本格式化库用法【标准】
C++如何直接操作位(Bit)来实现高效标志位?(位运算)
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。
1010
2023.08.02
scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
492
2023.10.18
500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
377
2023.10.25
Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。
1476
2023.07.26
端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。
1169
2023.07.27
当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。
835
2023.08.01
windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。
462
2023.08.02
在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。
2361
2023.08.08
本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。
3
2026.03.11
热门下载
相关下载
最新文章



