makefile之三:同一文件夹下多文件编译通用结构

本文详细解析了使用gcc编译器将C++源代码(.cpp文件)转换为可执行文件(.exe)的过程,包括编译阶段、链接阶段以及如何通过Makefile管理编译流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#这条语句定义了一个变量SRCS,它的值就是当前面目录下面所有的以.c结尾的源文件。
SRCS = $(wildcard *.c)

#这里变量OBJS的值就是将SRCS里面所有.c文件编译出的.o目标文件
OBJS = $(SRCS:.c = .o)

#变量CC代表我们要使用的编译器
CC = gcc

#这里指定除了编译器默认的头文件和库文件的路径之外需要额外引用的头文件路径以及库的路径(×××表示路径)。
#INCLUDES = -I/×××
#LIBS = -L/×××

#CCFLAGS变量存放的是编译选项
CCFLAGS = -g -Wall -O0

#my_app依赖于所有的.o文件,$^代表$(OBJS),$@代表my_app
my_app : $(OBJS)
    $(CC) $^ -o $@ #$(INCLUDES) $(LIBS)

#将所有的.c源代码编译成.o目标文件,%:模式规则
%.o : %.c
    $(CC) -c $^ $(CCFLAGS)
#在执行make clean之后删除所有编译过程中生成的.o文件。
clean:
    rm *.o

#每次执行make clean时都要执行rm *.o命令
.PHONY:clean

====================================================================================

CXX ?= g++

CXXFLAGS += -c -Wall $(shell pkg-config --cflags opencv) -std=c++11
LDFLAGS += $(shell pkg-config --libs --static opencv)


SRCS = $(wildcard *.cpp)
OBJS := $(patsubst %.cpp, %.o, ${SRCS})

EXEC=main
$(EXEC): $(OBJS)
    $(CXX) -o $@ $(OBJS) $(LDFLAGS)
$(OBJS):$(SRCS)
    $(CXX) -c $(SRCS) $(CXXFLAGS)

clean: ; rm -f *.o $(EXEC)
Makefile是一种用于编译和构建程序的自动化工具,它使用一种名为make的程序来控制编译过程。在Makefile中,您可以定义一系列的规则来说明如何编译和链接程序中的各个文件。当您需要编译多个C源文件时,可以在Makefile中创建一个规则,指定如何将这些C文件编译成目标文件(.o),然后链接成最终的可执行文件。 以下是一个简单的Makefile示例,它展示了如何编译多个C源文件: ```makefile # 定义编译器 CC=gcc # 定义编译选项 CFLAGS=-Wall # 定义目标可执行文件名 TARGET=your_program # 定义源文件列表 SRCS=main.c utils.c math.c # 定义目标文件列表,由源文件通过替换后缀得到 OBJS=$(SRCS:.c=.o) # 默认目标 $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) # 每一个.c文件对应一个.o文件的规则 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理编译生成的文件 clean: rm -f $(OBJS) $(TARGET) # 声明伪目标 .PHONY: clean ``` 在这个Makefile中: - `CC` 变量定义了使用的编译器,这里使用的是 `gcc`。 - `CFLAGS` 变量定义了编译选项,这里使用的是 `-Wall` 来开启所有警告。 - `TARGET` 变量定义了最终生成的可执行文件名。 - `SRCS` 变量定义了源文件的列表。 - `OBJS` 变量通过替换 `.c` 后缀为 `.o` 来生成目标文件列表。 - 默认目标依赖于 `$(OBJS)`,当所有的 `.o` 文件是最新的,或者没有任何 `.c` 文件更改过,make命令默认执行的规则将不会执行任何操作。 - `%.o: %.c` 规则说明了如何将每个 `.c` 文件编译成对应的 `.o` 文件。 - `clean` 目标用于删除所有编译生成的文件,这是一个伪目标,因为它的名字不对应于一个实际的文件名。 - `.PHONY` 声明告诉make,`clean` 是一个伪目标,确保每次执行 `make clean` 都会运行。 使用这个Makefile,您可以简单地运行 `make` 命令来编译您的程序,或者使用 `make clean` 来清理编译生成的文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值