Makefile用法简介

Make程序示例:
假设一个项目的程序由5个文件组成,源码如下:


/main.c/
#include “mytool1.h”
#include “mytool2.h”
int main()
{
mytool1_print(“hello mytool1!\n”);
mytool2_print(“hello mytool2!\n”);
return 0;
}


/mytool1.c/
#include “mytool1.h”
#include <stdio.h>
void mytool1_print(char *print_str)
{
printf(“This is mytool1 print :%s”,print_str);
}


/mytool1.h/
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif


/mytool2.c/
#include “mytool2.h”
#include <stdio.h>
void mytool2_print(char *print_str)
{
printf(“This is mytool2 print :%s”,print_str);
}


/mytool2.h/
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif


之后,创建原始Makefile文件:

main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f *.o main

之后,命令行输入:make,执行结果如下,并生成可执行文件 main.

root@vmuser-virtual-machine:/test# make
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o

命令行输入:./main,结果如下:

root@vmuser-virtual-machine:/test# ./main
This is mytool1 print :hello mytool1!
This is mytool2 print :hello mytool2!


改进一:使用用户自定义变量

make:$(OBJ)
gcc -o main $(OBJ)
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f *.o main

改进二:使用自动推导:

cc=gcc
OBJ=main.o mytool1.o mytool2.o
make:$(OBJ)
$(cc) -o main $(OBJ)
main.o:mytool1.h mytool2.h
mytool1.o:mytool1.h
mytool2.o:mytool2.h
.PHONY: clean
clean:
rm -f main $(OBJ)

让Make工程管理器自动推导,我们只需要有一个.o文件,它会自动地把对应的.c文件加到依赖文件中,而且gcc -c *.c也会被推导出来。

改进三:自动变量($@, , ^, <)的应用

cc=gcc
OBJ=main.o mytool1.o mytool2.o
make:$(OBJ)
$(cc) -o $@ $^
main.o:main.c mytool1.h mytool2.h
$(cc) -c $<
mytool1.o:mytool1.c mytool1.h
$(cc) -c $<
mytool2.o:mytool2.c mytool2.h
$(cc) -c $<
.PHONY: clean
clean:
rm -f main $(OBJ)

其中:
$@ 为目标文件;
$^ 为所有的依赖文件;
$< 为第一个依赖文件。

Makefile 是一个用于管理和自动化软件项目中的编译和构建过程的工具。通过 Makefile,可以定义一系列规则和依赖关系,告诉计算机如何构建和更新项目。 以下是 Makefile 的基本使用方法: 1. 创建一个名为 "Makefile" 或 "makefile" 的文件,并将其放置在项目根目录下。 2. 在 Makefile 中定义规则。每个规则由以下几部分组成: - 目标(Target):规定了要生成的文件或执行的操作。 - 依赖(Dependencies):规定了生成目标所需要的文件或操作。 - 命令(Command):规定了生成目标的具体操作。 例如,下面是一个简单的 Makefile 示例: ```makefile target: dependency1 dependency2 command1 command2 ``` 3. 定义规则后,可以在命令行中使用 `make` 命令执行 Makefile 中的规则。例如,要执行上述示例中的目标 `target`,可以运行命令: ``` make target ``` 4. Makefile 还提供了一些特殊的变量和函数,可以用于更灵活地定义规则。一些常用的变量包括: - `CC`:C 编译器的名称。 - `CFLAGS`:编译选项。 - `LDFLAGS`:链接选项。 - `SRC`:源文件列表。 - `OBJ`:目标文件列表。 - `BIN`:生成的可执行文件名。 你可以在规则中使用这些变量,例如: ```makefile CC = gcc CFLAGS = -Wall -O2 target: $(OBJ) $(CC) $(LDFLAGS) -o $(BIN) $(OBJ) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` 这是 Makefile 的基本使用方法,通过定义规则和使用 make 命令,你可以自动化编译和构建项目。更复杂的项目可能需要更详细的 Makefile 配置,你可以查阅相关文档来深入了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值