更高级的makefile(第2部分)

时间:2015-11-23 09:19:38

标签: c makefile

在我的上一篇文章后,我已经修复了我的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创建规则,其他人只是没有这样做,什么是正确的?

3 个答案:

答案 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 "$@" "$<"