一个最简单的Makefile例子(转)
原文地址:http://hi.baidu.com/hellosim/blog/item/42e78341b40c3e8db2b7dce3.html
转载请注明出处
1.hello.c
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
2.Makefile
hello : hello.o
cc -o hello hello.o
hello.o : hello.c
cc -c hello.c
clean :
rm hello.o
说明:cc -o hello hello.o前面是一个tab的空格
3.执行make,产生可执行文件hello
输出如下:
cc -c hello.c
cc -o hello hello.o
4.执行make clean,删除产生的中间文件hello.o
输出如下:
rm hello.o
另转:http://hi.baidu.com/s_rlzheng/blog/item/4bc10a06892e217d030881ef.html
本来早就应该学Makefile了,只是我偷懒,现在才学呵呵^_^makefile的好处叫我说,老实说我也说不出什么之所以然来,但是可以肯定的是它是linux平台的软件工程师都要必备的知识^_^
一、程序的编译及链接
我们编译程序,无非是想要得到一个可执行文件,而这个过程则是经过这两步:
***.c->编译->***.o->链接->可执行文件。即.c经过编译得到.o文件,.o文件是一个中间文件,再对这些中间文件进行链接最终可得到可执行文件。
二、Makefile的规则
首先,来看一看Makefile的书写规则:
target ... : prerequisites ...
command
...
...
target也就是一个目标文件,可以是.o文件,也可以是执行文件,还可以是一个标签(Label)。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令(任意的Shell命令)。这里要注意的是在命令前面要加上一个tab键,不是空格,是按一个tab键按出来的空格。
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比 target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则,也就是Makefile中最核心的内容。这是Makefile的主线和核心,但要写好一个Makefile还得继续努力。
三、一个最简单的Makefile例子
如有一个工程,含有3个头文件及四个c文件,那为了生成所需的可执行文件,这时的Makefile可以这样写:
test:main.o t1.o t2.o t3.o
gcc –o test main.o t1.o t2.o t3.o
main.o:main.c
gcc –c main.c
t1.o:t1.c t1.h
gcc –c t1.c
t2.o:t2.c t2.h
gcc –c t2.c
t3.o:t3.c t3.h
gcc –c t3.c
clean:
rm test main.o t1.o t2.o t3.o
到这里一个最简单的makefile就写好了,把它的名字保存为Makefile就可以了,这时你只要在终端敲一下make,它就自动帮你编译链接了^_^如果敲入make clean,它将删掉那些中间文件及可执行文件。
一个最简单的Makefile例子(转)相关推荐
- 一个最简单的Lucene例子
Lucene的使用,简单来说可以划分为两种类型,一是建立索引,二是搜索内容. 一.建立索引的五个基础类 Document, Field, IndexWriter, Analyzer, Director ...
- java quartz实例_一个非常简单的quartz例子
在quartz中一个作业实例必须实现org.quartz.Job接口 如: package com.unicom.gdnum.jobs; import java.util.*; import org. ...
- linux 一个超简单的makefile
2019独角兽企业重金招聘Python工程师标准>>> makefile 自动化变量: $@ : 规则的目标文件名 例如:main:main.o test.o g++ -Wall - ...
- 一个最简单的bootstrap例子
把下面这段html代码拷贝进index.html: <!DOCTYPE HTML> <html lang="en"><head><scri ...
- mvc登录实例 mysql_spring mvc + mybatis + mysql 调整的一个简单的登录例子
spring mvc + mybatis + mysql 整合的一个简单的登录例子 今天用spring跟mybatis整合写了一个简单的登录例子,第一次整合,给自己做个笔记,可能注释写的有点少,做的不 ...
- 收了100元辛苦费,写了一个最简单的C#ASP.NET的3层架构例子代码,源码是通过代码生成器生成的【写程序的效率神奇的高】...
为什么80%的码农都做不了架构师?>>> 有一个客户购买了代码生成器,虽然我把很多基础类库的源码及配套的源码都发给他了,但是他由于时间忙的原因,还是没自己仔细看,而是希望我以他 ...
- java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子
我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置D ...
- boost::math模块使用 non_finite_num facet 的一个非常简单的例子
boost::math模块使用 non_finite_num facet 的一个非常简单的例子 实现功能 C++实现代码 实现功能 boost::math模块使用 non_finite_num fac ...
- boost::math模块使用词法转换的一个非常简单的例子的测试程序
boost::math模块使用词法转换的一个非常简单的例子的测试程序 实现功能 C++实现代码 实现功能 boost::math模块使用词法转换的一个非常简单的例子的测试程序 C++实现代码 #inc ...
最新文章
- html5 点击事件委托,jquery事件委托
- 阿里云mysql服务器太贵_阿里云数据库,跟自己在服务器安装的有什么区别?有人说安装很简单,那为什么要花钱买?...
- 带中文索引的ListView 仿微信联系人列表
- select,poll,epoll的归纳总结区分
- python求均值标准差不用numpy_【Python】不用numpy用纯python求极差、平均数、中位数、众数与方差,python的打印...
- Tarjan点的双联通(寻找割点)
- 实例讲解遗传算法——基于遗传算法的自动组卷系统【实践篇】
- ArcMap|地理探测器(geoDetector)前在ArcGIS中的处理
- 数据库设计—图书管理数据库系统设计
- HUAWEI AC+AP设备配置
- codevs 5294 挖地雷
- 单例模式(Singleton)分析
- Google Earth Engine简介
- GIS(地理信息系统)近年来应用及发展状态
- 使用OneDNS完美解决办公网络优化问题
- [Git[ 解决 git branch -M main error: refname refs/heads/master not found
- 机器视觉系统——照明
- 百度地图之标注物聚合
- 微信小程序image图片自适应宽度比例显示的方法
- 「wps教程」Word里的大神器隐藏技能