vscode使用makefile批量创建obj文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vscode使用makefile批量创建obj文件相关的知识,希望对你有一定的参考价值。
参考技术A 1、scode终端下执行make指令,即可在build文件下编译出.hex.bin.elf文件,中间文件放在build/Obj/文件夹下。2、执行makeclean,可清除build文件夹。
3、执行makedownload,可一键下载hex到目标板子并让板子复位运行,相当于keil的一键下载按钮。
4、执行makereset,可以让板子复位运行一下。
5、执行makecommit,可一键推送到github或者giteee远程服务器上去,但前提是自己创建了这个工程的git。
Makefile vpath %.o 找不到 obj 文件
【中文标题】Makefile vpath %.o 找不到 obj 文件【英文标题】:Makefile vpath %.o not finding obj files 【发布时间】:2013-02-26 20:43:47 【问题描述】:我正在使用以下 vpath 来尝试定位我的 $(OBJ) 文件:
vpath %.o ./lib/obj
我的目标是这样设置的:
# Link target
link:
@echo "\nLinking files"
$(CC) $(LINK_FLAGS) -o main.elf $(OBJS)
查看输出时,我得到(对于所有 *.o 文件):
...error: misc.o: No such file or directory
我的项目结构如下:
.
├── Makefile
├── inc
│ └── main.h
├── lib
│ ├── inc
│ │ ├── cmsis
│ │ │ ├── arm_common_tables.h
│ │ │ ├── ...
│ │ ├── peripherals
│ │ │ ├── misc.h
│ │ │ ├── ...
│ │ └── stm32f4xx
│ │ ├── stm32f4xx.h
│ │ ├── ...
│ ├── obj
│ │ ├── misc.o
│ ├── src
│ │ ├── peripherals
│ │ │ ├── misc.c
│ │ │ ├── ...
│ │ └── system_stm32f4xx.c
│ └── startup_stm32f4xx.s
├── src
│ └── main.c
└── stm32f4.ld
为什么找不到我的 .o 文件?
完整输出供参考:
arm-none-eabi-gcc -T"stm32f3.ld" -nostartfiles -Wl,-Map,"main.map" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -L"./" -o main.elf misc.o stm32f4xx_adc.o stm32f4xx_can.o stm32f4xx_crc.o stm32f4xx_cryp.o stm32f4xx_cryp_aes.o stm32f4xx_cryp_des.o stm32f4xx_cryp_tdes.o stm32f4xx_dac.o stm32f4xx_dbgmcu.o stm32f4xx_dcmi.o stm32f4xx_dma.o stm32f4xx_exti.o stm32f4xx_flash.o stm32f4xx_fsmc.o stm32f4xx_gpio.o stm32f4xx_hash.o stm32f4xx_hash_md5.o stm32f4xx_hash_sha1.o stm32f4xx_i2c.o stm32f4xx_iwdg.o stm32f4xx_pwr.o stm32f4xx_rcc.o stm32f4xx_rng.o stm32f4xx_rtc.o stm32f4xx_sdio.o stm32f4xx_spi.o stm32f4xx_syscfg.o stm32f4xx_tim.o stm32f4xx_usart.o stm32f4xx_wwdg.o system_stm32f4xx.o
【问题讨论】:
【参考方案1】:$(OBJS)
只是一个变量,并被扩展为文本。当它出现在您的 link
规则中的命令文本中时,它会简单地扩展为文本。
vpath
搜索适用于先决条件,因此您必须安排 $(OBJS)
作为链接规则的先决条件,并将规则的命令显示为 use those prerequisites(通过自动变量,而不是直接使用$(OBJS)
)。
所以你的规则需要看起来更像
# Link target
link: main.elf
main.elf: $(OBJS)
@echo "\nLinking files"
$(CC) $(LINK_FLAGS) -o $@ $+
(我还冒昧地写出了生成的文件 (main.elf) 作为中间规则的非虚假目标。将这些内容明确地提供给 Make 通常是一个好主意.)
【讨论】:
我仍然得到与我的问题相同的输出,例如 misc.o 无法解析为 ./lib/out/misc.o @josef:大概您忽略了更改$(CC) ...
行以使用包含已解析的先决条件名称的自动变量($+
或$^
)。正如the documentation I pointed you at 中所述,这很关键。【参考方案2】:
虽然其他答案在他们所说的细节上是正确的,但这里有一个更大的点:不可能可靠地使用 VPATH/vpath 来查找 派生 文件,如 .o 文件你从你的makefile构建的。 VPATH/vpath 仅可用于查找 source 文件,例如 .c 文件。
你应该阅读http://make.mad-scientist.net/vpath.html
【讨论】:
【参考方案3】:vpath
只是告诉 make 在哪里找到文件,而不是编译器/链接器。你必须让 make 告诉编译器/链接器它在哪里找到它们。最简单的方法是使它们成为正确的依赖关系(以便在链接之前重建它们),然后使用$^
:
# Link target
link: $(OBJS)
@echo "\nLinking files"
$(CC) $(LINK_FLAGS) -o main.elf $^
【讨论】:
我仍然得到与我的问题相同的输出,例如 misc.o 无法解析为 ./lib/out/misc.o【参考方案4】:我已将以下内容添加到我的 Makefile:
OBJS = $(LIB_SRC:.c=.o)
OBJ_FILES = $(addprefix lib/out/,$(notdir $(LIB_SRC:.c=.o)))
并更新了目标:
link:
@echo "\nLinking files"
$(CC) $(LINK_FLAGS) -o main.elf $(OBJ_FILES)
链接器现在可以正确找到 .o 文件。
【讨论】:
是的,手工操作会很乏味。正如 Chris 所指出的,您希望使目标文件成为链接规则的正确依赖项(以便在必要时重新构建它们;这是使用 make 的最重要的一点!)。到那时,您最好通过vpath
/$+
正确地做到这一点,充分利用您拥有的先决条件。以上是关于vscode使用makefile批量创建obj文件的主要内容,如果未能解决你的问题,请参考以下文章
Nginx编译配置脚本篇(10)- Makefile相关脚本