makefile 学习一
近期在学习nginx,由于实在linux下,一些代码须要用makefile文件来编译,比較节省时间。
由于在nginx中加入一个新的模块假设用./configure方法来加入,特别是当你的代码有错时,改动以后又./configure,那么没编译一次都须要几分钟,实如今受不了了。就学习一下makefile,还有一个原因是自己曾经没有接触过linux,跟没有在linux下编写过代码。这次决定在学nginx的同一时候学习一个linux编程。当然就有必要学习一下makefile(按需求学习。重点放在学习nginx)。
gcc编译过程:
(1)预处
理:生成test.i文件
# cpp test.c-o test.i //或者
# cpp test.c > test.i //或者
# gcc -E test.c -o test.i
(2)编译:生成test.s文件
# gcc -S test.i
(3)汇编:生成test.o文件
# as -o test.o test.s //或者
# gcc -c test.s -o test.o
(4)链接:生成可运行文件test
# gcc -o test test.o
样例:
##程序执行的四个过程
gcc -E test.c -o test.i #预编译
gcc -S test.i -o test.s #汇编
gcc -c test.s -o test.o #编译
gcc -o test test.o #link
makefile的第一个样例:
main.c的代码:
#include <stdio.h>
#include <stdlib.h>
#include "print.h"
#include "computer.h" int main()
{
print("xxxx");
printf("%d\n", ret_add(1, 2));
return 0;
}
print.h的代码:
#include <stdio.h> void print(const char *str);
print.c的代码:
#include "print.h" void print(const char *str)
{
if (str == NULL)
{
printf("Empty String\n");
}
else
{
printf("%s\n", str);
}
}
computer.h的代码:
int ret_add(int a, int b);
computer.c的代码:
#include "computer.h" int ret_add(int a, int b)
{
return a+b;
}
用makefile来编译main.c:
main : main.o print.o computer.o
gcc -o main main.o print.o computer.o
main.o : main.c print.h computer.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
computer.o : computer.c computer.h
gcc -c computer.c
命令make -f mymakename
注意有时候会报例如以下错误:
makefile:11: *** 遗漏分隔符 。 停止.
这是由于gcc命令是以TAB開始的。所以全部的gcc命令之前必须加上一个TAB键
以上“:”左边的都称为目标文件,computer.o print.o main.o main 都是目标文件,但一个makefile仅仅有一个终于目标文件,其它目标文件都是为这个终于目标服务的。main是终于目标,其它目标都是服务于终于目标main。或者main依赖于其它目标。
“:”右边的是为生成左边的目标必须依赖的文件。computer.o的生成依赖预computer.c computer.h, main.o的生成依赖于main.c print.h couputer.h等
一些实用的变量:
$@目标文件。 比方computer.o print.o main.o main
$^全部依赖文件。比方main.o全部的依赖文件是main.c print.h couputer.h
$<全部依赖文件的第一文件。比方main.o所依赖的第一个文件是main.c
所以makefile能够这样写:
main : main.o print.o computer.o
gcc -o $@ $^
main.o : main.c print.h computer.h
gcc -c $<
print.o : print.c print.h
gcc -c $<
computer.o : computer.o computer.h
gcc -c $<
自己主动推到机制
makefile:
main : main.o print.o
computer.o
gcc -o main main.o print.o computer.o
main.o : print.h computer.h
print.o : print.h
computer.o : computer.h
make会依据目标文件自己主动推到须要的.c(.h?
)文件。而且调用gcc去编译。不如print.o这个目标。make知道须要computer.c这个文件而且条用gcc去编译。
使用变量
makefile
objects = main.o
print.o computer.o
main : $(objects)
gcc -o main $(objects)
main.o : main.c print.h computer.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
computer.o : computer.c computer.h
gcc -c computer.c
.PHONY: clean
clean:
-rm main $(objects)
makefile中能够使用变量,比方使用变量objects来保存目标文件。</p>
使用变量的优点是我们能够是改动变量的值,而不用改动对应的依稀项。比方我们定义一个变量depend = main.c print.h comput.h 来保存main.o的依赖项。当main.o的依稀项添加或降低时我们仅仅改动depend这个变量就能够了。
比方我们新增一个文件create.h,我们仅仅须要在depend的之后增加这个文件名称就能够了,这在大的项目中非常节省时间。
makefile 学习一的更多相关文章
- [转]Windows平台下Makefile学习笔记
		Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ... 
- makefile 学习归纳
		makefile 学习归纳 一直希望 好好整理下 makefile的写法,这在linux编程界是必备技能.下面就好好的说道说道. 可以参考的大神总结 整理 makefile是供make命令执行的 脚本 ... 
- <转>Windows平台下Makefile学习笔记(二)
		本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ... 
- makefile学习(1)
		GNU Make / Makefile 学习资料 GNU Make学习总结(一) GNU Make学习总结(二) 这篇学习总结,从一个简单的小例子开始,逐步加深,来讲解Makefile的用法. 最后用 ... 
- (二)我的Makefile学习冲动&&编译过程概述
		前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ... 
- Makefile学习笔记
		ls -l 查看文件详细信息 1.gcc -E test.c -o test.i//预编译gedit test.i //查看:高级C 2.gcc -Wall -S test.i -o test.s// ... 
- makefile学习笔记(多目录嵌套调用、变量使用)
		http://blog.csdn.net/leexiang_han/article/details/9274229 学习了几天的makefile的嵌套调用编写也有一些心得,先声明,我也是初学者写文 ... 
- Makefile学习(一)变量
		鉴于之前有一些了解,还有自己的学习习惯,我一上来就看Makefile的变量这一章.主要脉络是根据GNU make中文手册. 第六章:Makefile中的变量 6使用变量 定义:变量是一个名字,代表一个 ... 
- Makefile学习总结
		Makefile用法分析 在linux开发中,应用程序的编译基本都采用GNU的make工具,而make搭配Makefile来实现工程代码的编译,在越是大型复杂的项目中,make的强悍之处越是明 ... 
随机推荐
- UVA 10160 Servicing Stations(深搜 + 剪枝)
			Problem D: Servicing stations A company offers personal computers for sale in N towns (3 <= N < ... 
- 用DELPHI的RTTI实现对象的XML持久化
			去年我花了很多时间尝试用DELPHI进行基于XML的WEB应用开发.起初的设想是很美好的,但结果做出来的东西很简陋.一部分原因就在于XML到Object之间的数据绑定实现太麻烦(另一部分是因为对XSL ... 
- 查看内存数据的函数(ByteToHex和ByteToBin,最终都变成String)
			unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ... 
- asp.net检查服务器上目录或文件是否存在示例
			原文 asp.net检查服务器上目录或文件是否存在示例 asp.net为我们提供了文件系统对象了,对于目录与文件判断是否存在我们有System.IO.File.Exists与System.IO.Dir ... 
- Spring MVC Controller与jquery ajax请求处理json
			在用 spring mvc 写应用的时候发现jquery传递的[json数组对象]参数后台接收不到,多订单的处理,ajax请求: "}]}]} $.ajax({ url : url, typ ... 
- cryptography
			密码关还是有很多变态的题的,整理一下力所能及的吧. Circular Crypto(Asis-CTF2013) 这题只给了一张图片 仔细看一下就知道,这是几个单独的环,把它们分别整理出来.因为看着眼花 ... 
- XP教育网用户免费上网
			本文针对 XP 教育网用户免费上网,其他系统未作测试.若有疑问百度空间留言 http://hi.baidu.com/itas109 http://blog.csdn.net/itas109 步骤 ... 
- java python oracle推断字符串是否为数字的函数
			java public boolean isNumeric(String str){ Pattern pattern = Pattern.compile("^-?[0-9]+\\.?[0-9 ... 
- 自己写一个jqery的拖拽插件
			说实话,jQuery比原生的js好用多了,本来想用原生写的,也写出来的,仅仅是,感觉不像插件,所以用jQuery实现了一版. 实现的功能:能够指定拖拽的边界,在拖拽过程中,能够触发几个自己定义事件 先 ... 
- 与众不同 windows phone (3) - Application Bar(应用程序栏)
			原文:与众不同 windows phone (3) - Application Bar(应用程序栏) [索引页][源码下载] 与众不同 windows phone (3) - Application ... 
