在我的上一篇文章后,我已经修复了我的makefile的几个问题。目前它看起来像这样:
make all
Building file: src/general/nvic.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mlittle-endian -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -g3 -std=gnu11 -DSTM32F429xx -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_ITM -DUSE_HAL_DRIVER -DHSE_VALUE=8000000 -I"./src/application" -I"./src/application/config" -I"./src/application/task" -I"./src/module/adc" -I"./src/module/can" -I"./src/module/com" -I"./src/module/config" -I"./src/module/contactor" -I"./src/module/cpuload" -I"./src/module/io" -I"./src/module/ltc" -I"./src/module/spi" -I"./src/module/uart" -I"./src/engine/config" -I"./src/engine/database" -I"./src/engine/diag" -I"./src/engine/isoguard" -I"./src/engine/soc" -I"./src/engine/sof" -I"./src/engine/sysctrl" -I"./src/engine/task" -I"./src/general" -I"./src/general/config" -I"./src/general/includes" -I"./src/hal/CMSIS/Device/ST/STM32F4xx/Include" -I"./src/hal/CMSIS/Include" -I"./src/hal/STM32F4xx_HAL_Driver/Inc" -I"./src/os" -I"./src/os/FreeRTOS" -I"./src/os/FreeRTOS/Source" -I"./src/os/FreeRTOS/Source/include" -I"./src/os/FreeRTOS/Source/CMSIS_RTOS" -I"./src/os/FreeRTOS/Source/portable/GCC/ARM_CM4F" -I"./src/test" -I"./src/module/cpu" -I"./src/module/dma" -I"./src/module/irq" -I"./src/module/rcc" -I"./src/test/usb_cdc_lolevel" -MMD -MP -MF"objs/src/general/nvic.d" -MT"objs/src/general/nvic.o" -c -o "objs/src/general/nvic.o" "src/general/nvic.c"
src/general/nvic.c:108:1: fatal error: opening dependency file objs/src/general/nvic.d: No such file or directory
}
^
compilation terminated.
makefile:131: recipe for target 'objs/src/general/nvic.o' failed
make: *** [objs/src/general/nvic.o] Error 1
我想要做的最后一件事是将所有.o和.d文件放在/ src文件夹之外的/ objs子文件夹中。我编辑了makefile,但它给了我以下错误:
> "referrers":[{"id":"m.facebook.com","label":"m.facebook.com","count":466},{"id":"www.facebook.com","label":"www.facebook.com","count":102}],"countries":[{"id":"US","label":"United
> States","count":4},{"id":"AE","label":"United Arab
> Emirates","count":2},{"id":"MY","label":"Malaysia","count":1}]
任何提示我在这里做错了什么?
我需要做些什么才能生成这些文件夹?在一些makefile示例中,我看到人们使用mkdir创建规则,其他人只是没有这样做,什么是正确的?
答案 0 :(得分:0)
现行理论......
我们似乎很清楚,磁盘上尚不存在输出目录。对于知道mkdir -p
意味着什么的平台,可能的解决方案是
# compile src files
$(OBJSDIR)/%.o: %.c
mkdir -p $(@D) # Make the output directory, even if it already exists
@echo 'Building file: $<'
@echo 'Invoking: Cross ARM C Compiler'
arm-none-eabi-gcc $(CFLAGS) $(INCDIRS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '
为了解决在Windows或Linux下创建目录的问题,我建议使用this question的解决方案。
第一个理论......
您需要将gcc的调用与手册进行比较。特别是,由于makefile无法找到依赖项,因此我们对创建该文件的那部分感兴趣:
-MF"$(@:%.o=%.d)" -MT"$@"
-MF指定将写入依赖项文件的位置。然而,
An -MT option will set the target to be exactly the string you specify
我不认为你想要那个。删除-MT"$@"
可能足以解决您当前的问题。
如果没有,您是否愿意创建可重现的测试用例?我可以阅读当前的makefile,但是没有设置很多支持文件,我无法测试任何建议的修复。
编辑:虽然我喜欢上述理论,但似乎不正确。删除|插入-MT字符串对我自己的makefile没有明显的影响。
答案 1 :(得分:0)
我担心在目前的阶段我无法共享源代码。
编辑以下部分,一切正常(但将.o .d文件放在与我们想要更改的相应.c文件相同的文件夹中)
Tx
答案 2 :(得分:0)
您是否尝试将另一个pastsub
放入%.o: %.c
命令:
这样的事情:
%.o: %.c
arm-none-eabi-gcc $(CFLAGS) $(INCDIRS) -MMD -MP -MF"$(patsubst %.c,$(OBJSDIR)/%.d,@)" -MT"$@" -c -o "$@" "$<"