Makefile第一讲:一个简单的Makefile

简介: 摘要 假定你对linux已经比较的熟悉,假定你编程已经稍有经验,本文不会对文章作出太多基础性解释,看不懂莫怪,只当作给学习的朋友一个引导思路,我也是一个初学者,边学边写,将学会的教给大家,文章有错误之处误导了朋友,请轻喷 makefile   假定你对linux已经比较的熟悉,假定你编程已...

摘要 假定你对linux已经比较的熟悉,假定你编程已经稍有经验,本文不会对文章作出太多基础性解释,看不懂莫怪,只当作给学习的朋友一个引导思路,我也是一个初学者,边学边写,将学会的教给大家,文章有错误之处误导了朋友,请轻喷

 

假定你对linux已经比较的熟悉,假定你编程已经稍有经验,本文不会对文章作出太多基础性解释,看不懂莫怪,只当作给学习的朋友一个引导思路,我也是一个初学者,边学边写,将学会的教给大家,文章有错误之处误导了朋友,请轻喷

main.cpp

#include <iostream>
using namespace std; int main() { cout <<"Hello makefile"; return 0; } 

makefile

test:main.o
# 复制代码请注意,开头必须是一个tab,而不能是四个空格, 否则make会报错,这是必须的
    g++ main.o -o test

main.o:main.cpp g++ -c main.cpp -o main.o clean: rm main.o test 

在此,我会一行一行的解释给大家,暂且把形如这样的一个代码块命名为编译块吧,它俩是密不可分的一个整体:

test:main.o
    g++ main.o -o test
  • 要特别注意的是复制代码后,一定要把每行前边的空格换成tab,在makefile中tab是命令的开始标志,tab后面的被当作命令执行 ,如果是空格在make时肯定会报错
  • test:main.o告诉make命令,执行一个叫test的编译块,这个编译块依赖main.o文件(这句啥意思?请继续看),test编译块会执行命令g++ main.o -o test。g++表明这是编译c++程序,如果是c程序,请用gcc。这就是题外话了,与makefile无关,如果想了解gcc和g++命令,请在终端输入: g++ --help
  • main.o:main.cpp与上例类似,就不说了,上边提到test编译块依赖main.o文件,依赖的正是它,也就是说当执行test编译块时,test编译块需要main.o这个文件,于是它就到目录里去找main.o,但是它在目录里找不到main.o,这时他就在makefile文件里找main.o这样一个编译块,于是它就找到了main.o:main.cpp,接着它执行这个编译块下边的命令,然后生成了main.o这个文件,然后再执行test编译块中的命令g++ main.o -o test,最终生成可执行文件./test,由于这是一个最简单的,没任何依赖的C++程序,因此:其实main.o这个文件就是一个可执行文件,不信你在命令行试试:./main.o(可能需要改为可执行权限chmod u+x main.o
  • clean:编译块告诉make 当在终端执行make clean时执行rm main.o test命令,看到make clean你是否想到了在终端执行:make main.omake test命令呢?没有?这学习态度不太好哟,当你执行了这两个命令,脑子里应该立刻出现一个疑问:为毛我执行make clean命令就执行clean编译块,而我执行make命令却执行test编译块,我并没有告诉make我要执行test语句块啊?make是有约定的,如果你不指定让它执行哪个编译块,他就默认执行第一个编译块,不妨把clean编译块和第一个互换试试!
目录
相关文章
|
Web App开发 开发工具 git
如何下载Github上的单个文件或者指定目录?
如何下载Github上的单个文件或者指定目录?
3221 0
如何下载Github上的单个文件或者指定目录?
|
机器学习/深度学习 存储 Shell
分享使用谷歌Colab 常用小tips, 玩转Google Colab
分享使用谷歌Colab 常用小tips, 玩转Google Colab
分享使用谷歌Colab 常用小tips, 玩转Google Colab
条件变量函数pthread_cond_timedwait实现业务场景
条件变量函数pthread_cond_timedwait实现业务场景
363 0
|
存储 缓存 编解码
KiCad 插件
AD 文档转 KiCad 文件。 InteractiveHtmlBom kicad_text_tool kicad_tools kicad-action-scripts
2065 0
KiCad 插件
|
存储 安全 Java
基于Java+MySQL停车场车位管理系统详细设计和实现(源码+LW+调试文档+讲解等)
基于Java+MySQL停车场车位管理系统详细设计和实现(源码+LW+调试文档+讲解等)
|
11月前
|
存储 分布式计算 安全
阿里云服务器内存型r7、内存型r8y、内存型r8i实例规格性能对比与选择参考
在选择阿里云服务器实例规格时,针对内存密集型应用和数据库应用,内存型r7、内存型r8y和内存型r8i实例是这部分应用场景选择最多的热门实例规格。为了帮助大家更好地了解这三款实例的区别,并为选择提供参考,本文将详细对比它们的实例规格、CPU、内存、计算、存储、网络等方面的性能,并附上活动价格对比。让大家了解一下他们之间的不同,以供参考选择。
|
人工智能 IDE 测试技术
《AIGC+软件开发新范式》--07.通义灵码实战系列:一个新项目如何快速启动,如何维护遗留系统代码库?(1)
在AI 热度持续上升的当下,阿里云推出AI智能编码助手—通义灵码。通义灵码是一款基于阿里云通义代码大模型打造的智能编码助手,基于海量优秀开源代数据集和编程教科书训练,为开发者带来高效、流畅的编码体验。
219 1
|
JavaScript 前端开发 开发者
JavaScript(JS)和TypeScript(TS)的区别
JavaScript(JS)和TypeScript(TS)的区别
861 0
|
数据可视化 uml
UML图讲解(关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系)
UML图讲解,关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系。
5780 0
UML图讲解(关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系)
|
Web App开发 缓存 JavaScript
前端(四)——vue.js、vue、vue2、vue3
前端(四)——vue.js、vue、vue2、vue3
3748 0