각 c 파일을 개별적으로 컴파일한 다음 makefile을 사용하여 모든 개체를 링크하려면 어떻게 해야 합니까?

각 c 파일을 개별적으로 컴파일한 다음 makefile을 사용하여 모든 개체를 링크하려면 어떻게 해야 합니까?

나는 한동안 Microchip 마이크로컨트롤러를 사용해 왔으며 Netbeans를 매우 싫어합니다. 그래서 Mplab이 Netbeans로 옮긴 이후로 저는 모든 것을 스스로 하려고 노력했고 여기에 제가 필요한 도움이 있습니다:

.c프로젝트 폴더에 있는 모든 파일을 컴파일해서 각 파일별로 개체 파일을 만들고 싶습니다 . 마지막 명령은 .c모든 파일에 대한 링크입니다.object

내 makefile 중 하나를 붙여넣었습니다. 문제는 모든 프로젝트에 대해 이 작업을 수행해야 하며 .cmakefile에 파일 이름을 쓰지 않고 자동으로 만들려고 한다는 것입니다. 사용해 보았지만 wildcard컴파일할 때 오류가 발생했습니다. 여러 개의 대상 파일이 있는 경우 하나의 대상 파일을 생성합니다.

누구든지 나를 도울 수 있다면 매우 감사하겠습니다.

이것은 내 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

이제 끝났습니다.

관련 정보