近期在学习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 学习一的更多相关文章

  1. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  2. makefile 学习归纳

    makefile 学习归纳 一直希望 好好整理下 makefile的写法,这在linux编程界是必备技能.下面就好好的说道说道. 可以参考的大神总结 整理 makefile是供make命令执行的 脚本 ...

  3. <转>Windows平台下Makefile学习笔记(二)

    本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...

  4. makefile学习(1)

    GNU Make / Makefile 学习资料 GNU Make学习总结(一) GNU Make学习总结(二) 这篇学习总结,从一个简单的小例子开始,逐步加深,来讲解Makefile的用法. 最后用 ...

  5. (二)我的Makefile学习冲动&&编译过程概述

    前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...

  6. Makefile学习笔记

    ls -l 查看文件详细信息 1.gcc -E test.c -o test.i//预编译gedit test.i //查看:高级C 2.gcc -Wall -S test.i -o test.s// ...

  7. makefile学习笔记(多目录嵌套调用、变量使用)

    http://blog.csdn.net/leexiang_han/article/details/9274229   学习了几天的makefile的嵌套调用编写也有一些心得,先声明,我也是初学者写文 ...

  8. Makefile学习(一)变量

    鉴于之前有一些了解,还有自己的学习习惯,我一上来就看Makefile的变量这一章.主要脉络是根据GNU make中文手册. 第六章:Makefile中的变量 6使用变量 定义:变量是一个名字,代表一个 ...

  9. Makefile学习总结

    Makefile用法分析     在linux开发中,应用程序的编译基本都采用GNU的make工具,而make搭配Makefile来实现工程代码的编译,在越是大型复杂的项目中,make的强悍之处越是明 ...

随机推荐

  1. Linux chmod权限管理需要小心的地方

    档案的权限管理和简单,比如chmod 775 /tmp/test.sh 另外使用chmod +w /tmp/test.sh,会给档案的拥有者,群组,其他人的权限都加上了可编辑.这样就有安全隐患了.所以 ...

  2. [置顶] java Gui 键盘监听事件

    简单写一个java Gui键盘监听事件,实现的效果就是按下键盘控制台输出你按下的键.比如:按下A控制台就输出A 效果如图: 以下把实现的效果分为几个步骤: 1.新建一个窗体类继承窗体: 2.给这个窗体 ...

  3. FFMPEG H264/H265 编码延迟问题

    最新使用FFmpeg进行H264的编码时,发现视频编码有延迟,不是实时编码.进过一番研究发现,仅仅要在调用avcodec_open2函数 打开编码器时,设置AVDictionary參数就可以.关键代码 ...

  4. 远光软件ASP.NET笔试题小汇总

    ASP.NET笔试题是ASP.NET程序员面试必须经历的,一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据 ...

  5. 奇怪的问题,InvalidateRect最后一个参数在XP下无效

    一直用的WIN2K系统,写的一个程序在本机正常,到XP系统的机器运行发现调整窗口大小时界面闪得厉害,程序比较大,而且这种闪烁还不好调试,因为单步调试没有闪烁效果,只能排除法找原因,最后以为找到原因了, ...

  6. POJ 3017 单调队列dp

    Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8764   Accepted: 2576 ...

  7. App 运营 推广相关

    基本要素 1.定位和产品 2.取个好名字,一目了然+下载冲动 3.设计一个好图标,有感性和直观的认识 4.做好产品的说明.关键字,截图(前1-2行是重点) 5.做市场的排名(相关因素如下)   (1) ...

  8. Delphi/C#之父首次访华:55岁了 每天都写代码

    Delphi.C#之父Anders Hejlsberg 近日首次访华,并在10月24日和27日参加了两场见面会,分享了他目前领导开发的TypeScript项目,并与国内前端开发者近距离交流.本文就为读 ...

  9. 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

    眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...

  10. Php 解析XML文件

    Php 解析XML文件 Php 解析XML文件,仅供学习參考!演示样例代码例如以下: <?php header("Content-type: text/html; charset=ut ...