Makefile vpath%.o没有找到obj文件

jos*_*erk 3 gcc makefile

我正在使用以下vpath来尝试查找我的$(OBJ)文件:

vpath %.o ./lib/obj
Run Code Online (Sandbox Code Playgroud)

我的目标设置如下:

# Link target
link:
    @echo "\nLinking files"
    $(CC) $(LINK_FLAGS) -o main.elf $(OBJS)
Run Code Online (Sandbox Code Playgroud)

在查看输出时,我得到(对于所有*.o文件):

...error: misc.o: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我的项目结构如下:

.
??? 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
Run Code Online (Sandbox Code Playgroud)

为什么我的.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

Joh*_*all 5

$(OBJS)只是一个变量,并作为文本扩展.当它出现在link规则中的命令文本中时,它只是作为文本扩展.

vpath搜索应用于先决条件,因此您必须安排$(OBJS)将您的链接规则作为先决条件,并使规则的命令使用这些先决条件(通过自动变量,而不是直接使用$(OBJS)).

所以你的规则需要看起来更像

# Link target
link: main.elf

main.elf: $(OBJS)
    @echo "\nLinking files"
    $(CC) $(LINK_FLAGS) -o $@ $+
Run Code Online (Sandbox Code Playgroud)

(我也冒昧地将生成的文件(main.elf)写成中间规则的非虚假目标.将这些内容明确化为 Make通常是一个好主意.)

  • @josef:大概你忽略了改变`$(CC)...`行来使用包含已解析的先决条件名称的自动变量(`$ +`或`$ ^`).正如[我指出的文档](http://www.gnu.org/software/make/manual/html_node/Recipes_002fSearch.html)中所述,这很关键. (2认同)

Mad*_*ist 5

虽然其他答案在他们所说的细节中是正确的,但这里有一个更大的要点:不可能可靠地使用VPATH/vpath来查找派生文件,例如您从makefile构建的.o文件.VPATH/vpath 用于查找文件,例如.c文件.

你应该阅读http://make.mad-scientist.net/vpath.html