我正在使用以下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
答案 0 :(得分:5)
$(OBJS)
只是一个变量,并以文本形式展开。如果它出现在link
规则中的命令文本中,则只会将其展开为文本。
vpath
次搜索已应用于先决条件,因此您必须安排$(OBJS)
作为链接规则的先决条件以及规则命令$(OBJS)
。 3}}(通过自动变量,而不是直接使用# Link target
link: main.elf
main.elf: $(OBJS)
@echo "\nLinking files"
$(CC) $(LINK_FLAGS) -o $@ $+
)。
所以你的规则需要看起来更像
{{1}}
(我也冒昧地将生成的文件( main.elf )写成中间规则的非虚假目标。将这些内容明确化为Make通常是一个好主意。)
答案 1 :(得分:5)
虽然其他答案在他们所说的细节中是正确的,但这里有一个更大的要点:无法可靠地使用VPATH / vpath来查找派生的文件,例如.o文件你从makefile构建的。 VPATH / vpath仅 用于查找源文件,例如.c文件。
答案 2 :(得分:3)
vpath
只是告诉make在哪里找到文件,而不是编译器/链接器。你必须得到make来告诉编译器/链接器它找到它们的位置。最简单的方法是使它们成为正确的依赖项(以便在链接之前重建它们),然后使用$^
:
# Link target
link: $(OBJS)
@echo "\nLinking files"
$(CC) $(LINK_FLAGS) -o main.elf $^
答案 3 :(得分:1)
我已将以下内容添加到我的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文件。