makefile——小试牛刀
//a.h,包含头文件stdio.h,并且定义一个函数print
#include<stdio.h>
void print();
//b.c,包含头文件a.h,然后就可以写print函数的内容了
#include"a.h"
void print(){
printf("who are you\n");
}
//c.c,包含头文件a.h,调用print函数
#include"a.h"
int main(){
print();
return 0;
}
下面是Makefile 固定命名,记住这些文件全部在同一文件夹下,全部编写完成后,执行make命令就会自动执行Makefile了,
hello:c.o b.o //其中hello是目标文件,c.o和b.o是依赖文件,需要这两个文件才能生成hello,因为现在还没有c.o文件,所以跳到c.o:c.c a.h那里,然后执行gcc -c c.c 执行完成后又返回该条语句,发现也没有b.o,所以跳到b.o:b.c a.h
gcc -o hello c.o b.o //这个是shell命令
c.o:c.c a.h
gcc -c c.c //其中gcc -c c.c是指编译生产c.o(改成gcc -o c.o c.c会报错)
b.o:b.c a.h
gcc -c b.c
clean: //执行make clean会执行下面的语句
rm hello c.o b.o
执行效果如下
[root@bogon bp]# ls
a.h b.c c.c Makefile
[root@bogon bp]# make
gcc -c c.c
gcc -c b.c
gcc -o hello c.o b.o
[root@bogon bp]# ls
a.h b.c b.o c.c c.o hello Makefile
[root@bogon bp]# ./hello
who are you
改进后的方法,只需要修改Makefile
[root@bogon bp]# cat Makefile
objects=c.o b.o 相当于C语言的宏定义变量
hello:c.o b.o
gcc -o hello $(objects)
c.o:c.c a.h
gcc -c c.c
b.o:b.c a.h
gcc -c b.c
clean:
rm hello $(objects)
我们还能更精简这个过程,也是只修改Makefile
[root@bogon bp]# make
cc -c -o c.o c.c
cc -c -o b.o b.c
gcc -o hello c.o b.o
[root@bogon bp]# ls
a.h b.c b.o c.c c.o hello Makefile
[root@bogon bp]# ./hello
who are you
[root@bogon bp]# cat Makefile
objects=c.o b.o
hello:c.o b.o
gcc -o hello $(objects)
$(bojects):a.h 因为c.o和b.o都依赖a.h
c.o:c.c 可以省略掉gcc
b.o:b.c
clean:
rm hello $(objects)
[root@bogon bp]#
上面是我自己总结写的,原文如下http://www.cnblogs.com/sld666666/archive/2010/04/08/1707789.html
进行内核编译的时候make会多两个选项,-C和-M.
其中-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。
makefile——小试牛刀的更多相关文章
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用(后续)
在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]里面提到了Microsoft 身份认证,其实这也是一大块需要注意的地方,特作为后续补充这些知识点.上章是使用了Microsof ...
- 编写一个通用的Makefile文件
1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...
- 编写简单的Makefile文件
makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c x.h 表示生成www这个文件需 ...
- 简单编写Makefile
相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有 ...
- [转]Linux中configure/makefile
本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代 ...
- Linux内核配置、编译及Makefile简述
Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...
- make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”
默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...
- 实例:对2个Makefile的备注
实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...
随机推荐
- Linux音频驱动学习之:(2)移植wm8976声卡驱动(linux-3.4.2)
1.wm8976驱动程序: /* * wm8976.h -- WM8976 Soc Audio driver * * This program is free software; you can re ...
- 在ros功能包CMakeLists.txt中获取所在功能包的路径 便于添加第三方库的相对路径
在 ros 功能包中要使用第三方的动态库,将其放在系统默认库路径和使用绝对路径均不可取,这样的话可移植性较差,将该功能包移到其它电脑时要重新配置依赖库的路径,太麻烦了. 于是找到下面这个方法,解决了R ...
- CentOS7安装配置Bacular
参考: http://blog.51cto.com/molewan/2045602 https://blog.csdn.net/heshangkung/article/details/47955023 ...
- 数位DP详解
算法使用范围 在一个区间里面求有多少个满足题目所给的约束条件的数,约束条件必须与数自身的属性有关 下面用kuangbin数位dp的题来介绍 例题 不要62 题意:在一个区间里面求出有多少个不含4和6 ...
- 漫步Java------初识java
一. Java语言概述 语言:是人与人之间用于沟通的一种方式. 例如:中国人与中国人用普通话沟通.而中国人要和英国人交流,就要学习英语. 计算机语言(编程语言): 人与计算机交流的方式.如果人要与计算 ...
- css 伪类: 1)a:link , a:visited, a:hover, a:active 2):first-child
1. 链接伪类: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...
- 深入浅出 - vue变化侦测原理
废话真多!!! 其实在一年前我已经写过一篇关于 vue响应式原理的文章,但是最近我翻开看看发现讲的内容和我现在心里想的有些不太一样,所以我打算重新写一篇更通俗易懂的文章. 我的目标是能让读者读完我写的 ...
- 并行【parallel】和并发【concurrency】线程是并发还是并行,进程是并发还是并行
线程是并发,进程是并行:进程之间相互独立,是系统分配资源的最小单位,同一个线程中的所有线程共享资源. 并行,同一时刻多个任务同时在运行. 并发,在同一时间内隔内多个任务都在运行,但是都不会在同一时刻同 ...
- PHP ueditor编辑器使用(TP5)
百度搜索ueditor,下载,解压,把需要的JS文件放到对应的目录里,根据框架的不同目录也不一样 在文件中引入需要的JS文件 HTML代码 <div> <!-- 编辑器 --> ...
- 前端笔记 (3.JavaScript 2)
一般来说,js代码越来越庞大的时候,最好要把它存在一个js文件中, 通过src引入即可,这样具有维护性高,可缓存(加载一次,无需加载) 方便未来拓展的特性 正确写法: <script type= ...