Makefile第一讲:一个简单的Makefile

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

makefile

 

假定你对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编译块和第一个互换试试!
时间: 2024-10-11 15:44:05

Makefile第一讲:一个简单的Makefile的相关文章

多目标-一个简单的 Makefile 问题

问题描述 一个简单的 Makefile 问题 5C 12 13 #每个 obj 的依赖项,最好写上依赖的 .h,否则 .h 更改将不重新编译 .o 14 15 CRequestHandlerFactory.o:./CRequestHandlerFactory.cpp ./CRequestHandlerFactory.h ./CRequestHandler.h 16 $(CXX) -c $(CXXFLAGS) -o CRequestHandlerFactory.o ./CRequestHandle

linux Makefile编写总结及常用的Makefile编写格式

以下是对 Linux Makefile的编写整理的五个步骤: 编译总共为五个部分 1.设置编译环境 set compile environment 2.获取要编译的源文件,以及把源文件转换为目标文件 ( 源文件和目标文件) source to obj 3.将文件编译为目标文件 OBJing 4.将目标文件链接成可执行文件或(打包为)动态库,或静态库  linking 5.其他方面 clean等 下面给出一个简单的makefile模板(实际项目中可依照此模板进行扩展): 来看看这个模板: ## 设

一个简单的通用Makefile实现

Makefile是Linux下程序开发的自动化编译工具,一个好的Makefile应该准确的识别编译目标与源文件的依赖关系,并且有着高效的编译效率,即每次重新make时只需要处理那些修改过的文件即可.Makefile拥有很多复杂的功能,这里不可能也没必要一一介绍,为了简化问题的复杂性,本文仅和大家讨论针对单目录下的C/C++项目开发,如何写一个通用的Makefile. 首先,我们假设当前工程目录为prj/,该目录下有6个文件,分别是:main.c.abc.c.xyz.c.abc.h.xyz.h和M

linux驱动-关于简单内核模块Makefile文件???

问题描述 关于简单内核模块Makefile文件??? ifeq ($(KERNELRELEASE),) KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install clean: rm -r

用c实现简单的shell-用讲过的各种C函数实现一个简单的交互式Shell

问题描述 用讲过的各种C函数实现一个简单的交互式Shell 1.给出提示符,让用户输入一行命令,识别程序名和参数并调用适当的exec函数执行程序,待执 行完成后再次给出提示符. 2.识别和处理以下符号: 简单的标准输入输出重定向(<和>):仿照例30.5 "wrapper",先dup2然后exec. 管道(|):Shell进程先调用pipe创建一对管道描述符,然后fork出两个子进程,一个子进程 关闭读端,调用dup2把写端赋给标准输出,另一个子进程关闭写端,调用dup2把

用C语言来实现一个简单的虚拟机_C 语言

 必要的准备工作及注意事项: 在开始之前需要做以下工作:     一个C编译器--我使用了 clang 3.4,也可以用其它支持 c99/c11 的编译器:     文本编辑器--我建议使用基于IDE的文本编辑器,我使用 Emacs;     基础编程知识--最基本的变量,流程控制,函数,数据结构等:     Make 脚本--能使程序更快一点. 为什么要写个虚拟机? 有以下原因:     想深入了解计算机工作原理.本文将帮助你了解计算机底层如何工作,虚拟机提供简洁的抽象层,这不就是一个最好的学

【 MAKEFILE 编程基础之二】MAKEFILE 书写规划以及语法规则!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/768.html 书写规则: 规则包含两个部分,一个是依赖关系,一个是生成目标的方法. 在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么.一般来说,定义在Makefile中的目标可能会有很多,但是

Ultradev实例教程:3.7 创建一个简单的查询

创建|教程 第三章:应用数据库创建动态网页 第七节:创建一个简单的查询 其实查询创建的原理与我们在上面学到的数据编辑原理是一样的,都是先从第一个页面传递一个值给第二个页面,然后第二个页面根据这个传递过去的值取出相应的纪录,再做以相应的处理,如显示.编辑.删除.所不同的是传递方式.上一节我们是通过地址连接来传递值,而我们知道一般查询都是通过一个表单填写数据然后提交的. 好,就让我们来看看具体的创建过程. 首先我们要创建一个用户能够输入查询内容的页面.如图,我们插入一个名为Search的类型为Tex

第一讲 Java语言概述

★ 第一讲 Java语言概述 [课前思考] 1. 一门新的语言的产生是否需要借鉴以前的编程语言? 2. 在java语言出现之前是否存在其它跨平台的语言? 3. 有哪些编程语言是面向对象的?而哪些编程语言是面向过程的?从编程思路上存在着哪些本质差别?C++语言是面向对象的还是面向过程的? 4. 一段优秀的程序代码是否应该是可读性极强的?程序员之间是否应该遵循相同的编程规范? 5. 一个程序员编好的代码如果需要让别的程序员使用,如何提供该代码的使用说明? 1.1 java语言的发展史 1.1.1 j