makefile 基础

Makefile的一个具体的实例:使用预定义变量的makefile文件,这个还行。下面很多错

http://blog.sina.com.cn/s/blog_73d4d5fa0100paiy.html

了解automake和autoconf(autoreconf)

https://blog.youkuaiyun.com/u010020404/article/details/82770848

 

set -e 和 set -x

在你开始构思并写下具体的代码逻辑之前,先插入一行set -e和一行set -x。

set -x会在执行每一行 shell 脚本时,把执行的内容输出来。它可以让你看到当前执行的情况,里面涉及的变量也会被替换成实际的值。

set -e会在执行出错时结束程序,就像其他语言中的“抛出异常”一样。(准确说,不是所有出错的时候都会结束程序,见下面的注)

 

# test:a.o b.o
#     gcc -o test a.o b.o

# a.o : a.c
#     gcc -c -o a.o a.c

# b.o : b.c
#     gcc -c -o b.o b.c

test: a.o b.o c.o
    gcc -o test $^

%.o : %.c
    gcc -c -o $@ $<

 

%.o:表示所用的.o文件

%.c:表示所有的.c文件

$@:表示目标

$<:表示第1个依赖文件

$^:表示所有依赖文件

Makefile 是一种用于自动化构建项目的工具,广泛应用于 C/C++ 项目中。它通过定义一系列规则来控制编译、链接等过程,从而实现高效的项目管理。以下是 Makefile基础知识和使用方法的详细解析。 ### 1. Makefile 的基本结构 Makefile 的核心是定义 **目标(Target)**、**依赖(Dependencies)** 和 **命令(Commands)**。基本格式如下: ``` 目标: 依赖 <TAB>命令 ``` 目标通常是最终生成的可执行文件或中间目标文件(如 `.o` 文件)。依赖是生成目标所需要的文件。命令是用于生成目标的具体操作,必须以 `<TAB>` 开头。 例如: ```makefile main: main.o utils.o $(CC) -o main main.o utils.o ``` 在这个例子中,`main` 是目标,`main.o` 和 `utils.o` 是依赖文件,`$(CC)` 是编译器变量,通常定义为 `gcc` 或 `g++`。 ### 2. 变量的定义与使用 Makefile 支持变量定义,可以简化重复的代码。变量通过 `=` 或 `:=` 进行赋值,使用时通过 `$(变量名)` 调用。 例如: ```makefile CC = gcc CFLAGS = -Wall -Wextra -g DEPS = demo.h OBJ = demo.o demo: $(OBJ) $(CC) -o $@ $^ $(CFLAGS) ``` 在上述代码中,`CC`、`CFLAGS`、`DEPS` 和 `OBJ` 都是自定义变量,分别表示编译器、编译选项、依赖文件和目标文件 [^3]。 ### 3. 伪目标(.PHONY) 某些目标(如 `clean`)并不是实际的文件,而是用于执行特定操作。为了防止与同名文件冲突,需要使用 `.PHONY` 显式声明这些目标。 例如: ```makefile .PHONY: clean clean: rm -f *.o main ``` 此代码定义了一个伪目标 `clean`,用于删除所有 `.o` 文件和最终生成的 `main` 可执行文件 [^4]。 ### 4. 模式规则(Pattern Rules) 模式规则用于匹配多个文件,通常使用 `%.o: %.c` 这样的形式,表示所有 `.o` 文件都依赖于对应的 `.c` 文件。 例如: ```makefile %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) ``` 该规则表示:所有 `.o` 文件由对应的 `.c` 文件和依赖文件 `$(DEPS)` 编译生成 [^3]。 ### 5. 自定义函数(Custom Functions) Makefile 支持自定义函数,通常使用 `define` 和 `endef` 定义函数体,并通过 `call` 调用。 例如: ```makefile define compile-c $(CC) -c -o $1 $2 $(CFLAGS) endef main.o: main.c $(call compile-c,main.o,main.c) ``` 在这个例子中,`compile-c` 是一个自定义函数,接受两个参数(目标文件和源文件),并执行编译操作 [^2]。 ### 6. 自动变量(Automatic Variables) Makefile 提供了一些自动变量,用于简化规则的编写: - `$@`:表示目标文件。 - `$<`:表示第一个依赖文件。 - `$^`:表示所有依赖文件。 例如: ```makefile main: main.o utils.o $(CC) -o $@ $^ $(CFLAGS) ``` ### 7. 示例 Makefile 以下是一个完整的 Makefile 示例: ```makefile CC = gcc CFLAGS = -Wall -I. DEPS = demo.h OBJ = demo.o AIM = demo $(AIM): $(OBJ) $(CC) -o $@ $^ $(CFLAGS) %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) .PHONY: clean clean: rm -f $(OBJ) $(AIM) ``` 该 Makefile 定义了编译 `demo.c` 生成 `demo` 可执行文件的规则,并支持清理操作 [^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值