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 是一个用于自动化编译和构建程序的工具。它可以帮助开发人员管理项目中的依赖关系和文件的编译顺序,从而提高项目的编译效率和可维护性。 学习 Makefile 可以带来以下好处: 1. 自动化编译:通过 Makefile,我们可以定义编译规则和依赖关系,使得程序的编译过程更加自动化。只需要运行 make 命令,Makefile 将会根据文件的修改时间判断哪些文件需要重新编译,从而加快程序的构建速度。 2. 管理依赖关系:Makefile 支持定义不同文件之间的依赖关系,当某个文件被修改时,只有它的依赖文件也被修改了,才需要重新编译。这种管理依赖关系的方式可以减少不必要的编译时间,提高编译效率。 3. 支持多平台:Makefile 是跨平台的,可以在不同操作系统上使用。这意味着我们可以使用相同的 Makefile 来在 Windows、Linux、macOS 等多个平台上进行程序构建,而不需要为每个平台编写不同的构建脚本。 4. 高度可定制:Makefile 的语法相对简单,但非常灵活,允许开发人员根据项目的需求自定义规则。我们可以通过定义变量、宏、规则和命令等来构建一个适合自己项目的 Makefile,满足特定的编译和构建需求。 5. 方便协作开发:在多人协作开发项目时,使用 Makefile 可以统一编译和构建的方式,避免因为不同开发环境导致的构建问题。每个开发人员只需要按照 Makefile 中定义的规则进行编译,从而保证整个项目的一致性和可靠性。 总的来说,学习 Makefile 可以帮助我们更好地管理项目的编译和构建,提高开发效率和项目的可维护性。掌握 Makefile 的基本语法和原理,能够更好地适应大型项目的开发和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值