各cファイルを個別にコンパイルし、makefileを使用してすべてのオブジェクトをリンクするにはどうすればよいですか?

各cファイルを個別にコンパイルし、makefileを使用してすべてのオブジェクトをリンクするにはどうすればよいですか?

私はしばらくMicrochipマイクロコントローラを使用してきましたが、Netbeansは非常に嫌いです。だからMplabがNetbeansに移って以来、私はすべてを自分でやろうとし、ここで私が必要とする助けがあります:

.cプロジェクトフォルダ内のすべてのファイルをコンパイルして、各ファイルごとにオブジェクトファイルを作成したいと思います。最後のコマンドは.cすべてのファイルへのリンクです。object

私のmakefileの1つを貼り付けました。問題は、すべてのプロジェクトに対してこれを行う必要があり、.cmakefileにファイル名を書かずに自動的に作成しようとすることです。試してみましたが、wildcardコンパイル時にエラーが発生しました。複数のターゲットファイルがある場合は、1つのターゲットファイルを作成します。

誰でも私を助けることができればとても感謝します。

これは私のmakefileの一つです。

CFLAGS = -c -MP -MMD -g -omf=elf -DXPRJ_default=default -legacy-libc -O2 -msmart-io=1 -msfr-warn=off -mdfp="/opt/microchip/mplabx/v6.15/packs/Microchip/dsPIC30F_DFP/1.4.104/xc16"
MOREFLAGS = -pedantic -msmall-code -msmall-data -msmall-scalar -Wall -std=c99 -ansi
MCPU = -mcpu=30F4013
DSPFLAGS = --library=q --library=dsp
COMLINK = -omf=elf -mdfp="/opt/microchip/mplabx/v6.15/packs/Microchip/dsPIC30F_DFP/1.4.104/xc16"

build: build1 build2 build3 build4 build5 build6 build7 build8 build9

build1:
    xc16-gcc ds18b20.c      -o ds18b20.o    ${MCPU} ${CFLAGS} ${MOREFLAGS}

build2:
    xc16-gcc ADC.c          -o ADC.o        ${MCPU} ${CFLAGS} ${MOREFLAGS}

build3:
    xc16-gcc config.c       -o config.o     ${MCPU} ${CFLAGS} ${MOREFLAGS}

build4:
    xc16-gcc intConfig.c    -o intConfig.o  ${MCPU} ${CFLAGS} ${MOREFLAGS}

build5:
    xc16-gcc uartConfig.c   -o uartConfig.o ${MCPU} ${CFLAGS} ${MOREFLAGS}

build6:
    xc16-gcc I2C_Lib.c      -o I2C_Lib.o    ${MCPU} ${CFLAGS} ${MOREFLAGS}

build7:
    xc16-gcc LCD_I2C.c      -o LCD_I2C.o    ${MCPU} ${CFLAGS} ${MOREFLAGS} 

build8:
    xc16-gcc -o ds18b20.elf ds18b20.o ADC.o config.o intConfig.o uartConfig.o I2C_Lib.o LCD_I2C.o ${MCPU} -DXPRJ_default=default -legacy-libc -Wl,,,--defsym=__MPLAB_BUILD=1,,--script=p30F4013.gld,--stack=16,--check-sections,--data-init,--pack-data,--handles,--isr,--no-gc-sections,--fill-upper=0,--stackguard=16,--no-force-link,--smart-io,--report-mem,--memorysummary,memoryfile.xml ${COMLINK}

build9:
    xc16-bin2hex ds18b20.elf -a ${COMLINK}
    
clean:
    rm -f *.d *.o *.elf *.xml *.hex *.map
    
# https://gcc.gnu.org/onlinedocs/
# https://onlinedocs.microchip.com/pr/GUID-C4E60FF5-3DAB-44F1-BA61-4BD962D8F469-en-US-2/index.html?GUID-A3D1ECDB-7A9F-42AF-A832-DB5288E4EA04

ベストアンサー1

GNU Makeを使用すると、既存のCファイルに基づいてオブジェクトファイルのリストを作成できます。次のように:

OBJS := $(patsubst %.c,%.o,$(wildcard *.c))

それからあなたは必要です静的モードルールターゲットファイルを別々にビルドします。

$(OBJS): %.o: %.c
        xc16-gcc -c $(CFLAGS) $< -o $@ $(MCPU) $(MOREFLAGS)

-cから削除CFLAGS)または使用できるように変数を設定します。独自の基本ルールを作成してください。:

CC = xc16-gcc $(MCPU)
CFLAGS += $(MOREFLAGS)

次に、実際のターゲットを使用してリンクされたバイナリのルールを定義します(常に偽のターゲットよりも実際のターゲットを使用する方が良い)。

ds18b20.elf: $(OBJS)
        xc16-gcc -o $@ $^ $(MCPU) -DXPRJ_default=default -legacy-libc -Wl,,,--defsym=__MPLAB_BUILD=1,,--script=p30F4013.gld,--stack=16,--check-sections,--data-init,--pack-data,--handles,--isr,--no-gc-sections,--fill-upper=0,--stackguard=16,--no-force-link,--smart-io,--report-mem,--memorysummary,memoryfile.xml $(COMLINK)

最後に.hex目標です(目標が明示的に表示されないため、これについてはわかりません)。

ds18b20.hex: ds18b20.elf
        xc16-bin2hex $< -a $(COMLINK)

最初の偽のターゲットを次に置き換えます。

build: ds18b20.hex

これで終わりました。

おすすめ記事