Makefile的最后一点问题也解决了

上期遗留了一个问题,就是在执行make后链接步骤会提示找不见.o文件,再次make才能编译成功。经过最近的修改,这个问题终于解决了。思路如下:

一、思考太死板,只会在中间使用自动化变量,不知道变通。

此次就是不使用自动化变量,使用自定义变量反而达到了效果。

$(LD) $(LDFLAGS) $(sort $(addprefix ./Build/,$(C_INCLUDE:%.c=%.o))) -T $(LD_SOURCE) -o $(TARGET).elf

这是使用后的代码段。

执行make后效果

Makefile:26: delay.o main.o stm32f4xx_gpio.o stm32f4xx_rcc.o stm32f4xx_spi.o system_stm32f4xx.o
arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -g -I /home/fxx/Desktop/Progect/Dev/ -DSTM32F40_41xxx -c ./Dev/delay.c -o ./Build/delay.o
arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -g -I /home/fxx/Desktop/Progect/Dev/ -DSTM32F40_41xxx -c ./User/main.c -o ./Build/main.o
arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -g -I /home/fxx/Desktop/Progect/Dev/ -DSTM32F40_41xxx -c ./Dev/stm32f4xx_gpio.c -o ./Build/stm32f4xx_gpio.o
arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -g -I /home/fxx/Desktop/Progect/Dev/ -DSTM32F40_41xxx
在 C/C++ 程序中,通常会将程序分为多个源文件,每个源文件实现不同的功能模块。当编译这些源文件时,我们需要使用 makefile 来管理这些源文件的编译和链接过程。 makefile 中需要解决的一个重要问题就是跨文件问题。在一个源文件中使用了另一个源文件中定义的函数或变量时,编译器会提示未定义的引用错误。为了解决这个问题,我们需要在 makefile 中指定编译器搜索头文件和库文件的路径,并将需要链接的目标文件或库文件添加到链接命令中。 具体来说,我们可以在 makefile 中定义变量来保存源文件、头文件和库文件的路径等信息,然后在编译和链接命令中使用这些变量。例如: ```makefile # 定义变量 SRC_DIR := src INC_DIR := include LIB_DIR := lib OBJ_DIR := obj # 指定编译器和编译选项 CC := gcc CFLAGS := -Wall -Werror -I$(INC_DIR) # 指定链接器和链接选项 LD := gcc LDFLAGS := -L$(LIB_DIR) -lmylib # 指定目标文件和依赖关系 TARGET := myapp OBJS := $(addprefix $(OBJ_DIR)/, main.o utils.o) DEPS := $(wildcard $(INC_DIR)/*.h) # 编译规则 all: $(TARGET) $(TARGET): $(OBJS) $(LD) $(LDFLAGS) $^ -o $@ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS) $(CC) $(CFLAGS) -c $< -o $@ # 清理规则 clean: rm -rf $(OBJ_DIR)/*.o $(TARGET) ``` 在上面的 makefile 中,我们定义了四个变量:`SRC_DIR` 表示源文件目录,`INC_DIR` 表示头文件目录,`LIB_DIR` 表示库文件目录,`OBJ_DIR` 表示目标文件目录。我们还定义了编译器和链接器的变量,以及编译选项和链接选项的变量。 在编译规则中,我们定义了目标文件 `$(TARGET)` 和依赖关系 `$(DEPS)`,并使用 `$(addprefix)` 函数将源文件的路径和目标文件的路径拼接起来。在编译命令中,我们使用 `-I` 选项指定头文件的路径,并使用 `-c` 选项生成目标文件。 在链接规则中,我们使用 `$(LD)` 变量指定链接器,并使用 `-L` 选项指定库文件的路径,`-l` 选项指定需要链接的库文件。在链接命令中,我们使用 `$^` 变量表示所有的依赖文件,`-o` 选项指定生成的可执行文件的名称。 最后,我们还定义了一个清理规则,用于删除生成的目标文件和可执行文件。 通过使用 makefile,我们可以方便地管理多个源文件的编译和链接过程,解决跨文件问题,提高代码的可维护性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个人创造世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值