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的强悍之处越是明 ...
随机推荐
- 隐藏AutoCompleteTextView下拉框的滚动条
最近做项目需要用到AutoCompleteTextView这个控件,而其下拉框的滚动条有点难看,于是想去掉.走了些弯路,终于弄通了. 首先先介绍一种不靠谱的方法:反射机制 为什么会有人想到用这个呢? ...
- Problem D: Flip Five
大致题意:3 * 3的黑白格,在翻转的时候会本身和四周的都翻转,问最小翻转几次变成全部是白色解题思路:把3 * 3 = 9 个格子进行全排列,然后穷举然后找翻转的最小次数 #include <i ...
- JavaScript快速入门(六)——DOM
概念扫盲 DOM DOM是 Document Object Model(文档对象模型)的缩写,是W3C(万维网联盟)的标准.DOM 定义了访问 HTML 和 XML 文档的标准:“W3C 文档对象模型 ...
- 使用简单的 5 个步骤设置 Web 服务器集群
通过在多个处理器之间分担工作负载并采用多种软件恢复技术,能够提供高度可用的环境并提高环境的总体 RAS(可靠性.可用性和可服务性).可以得到的好处包括:更快地从意外中断中恢复运行,以及将意外中断对终端 ...
- Java深入解析读书笔记(一)
1. goto,const为java的两个保留关键字,无任何应用语法.因此从不使用. goto 使用循环标签:if,break out,here实现goto的功能. 2. 标识符:可由字母数字下划 ...
- PHP正则表达式完全手册
原文:PHP正则表达式完全手册 php的正则表达式完全手册 前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感.只要认真去阅读这些资料,加上应用的时候进行 ...
- ASI简单实现网络编程
使用iOS SDK中的HTTP网络请求API,相当的复杂,调用比較麻烦.ASIHTTPRequest 对CFNetwork API进行了封装.而且使用起来非常easy的一套API,在非常多比較老旧的项 ...
- WM_SYSCOMMAND消息命令整理 good
注意:1. 使用WM_SYSCOMMAND时,鼠标的一些消息可能会受到影响,比如不能响应MouseUp事件,可以在窗口中捕获WM_SYSCOMMAND消息,并判断消息的CommandType来判断消息 ...
- ORACLE常用数据库类型(转)
oracle常用数据类型 1.Char 定长格式字符串,在数据库中存储时不足位数填补空格,它的声明方式如下CHAR(L),L为字符串长度,缺省为1,作为变量最大32767个字符,作为数据存储在ORAC ...
- Dvtm -- 平铺式终端
Dvtm -- 平铺式终端_Linux伊甸园开源社区-24小时滚动更新开源资讯,全年无休! Dvtm -- 平铺式终端 关注我们: 如果你使用过 Dwn 或 Awesome 这种平铺式窗口管理器,一定 ...