나는 한동안 Microchip 마이크로컨트롤러를 사용해 왔으며 Netbeans를 매우 싫어합니다. 그래서 Mplab이 Netbeans로 옮긴 이후로 저는 모든 것을 스스로 하려고 노력했고 여기에 제가 필요한 도움이 있습니다:
.c
프로젝트 폴더에 있는 모든 파일을 컴파일해서 각 파일별로 개체 파일을 만들고 싶습니다 . 마지막 명령은 .c
모든 파일에 대한 링크입니다.object
내 makefile 중 하나를 붙여넣었습니다. 문제는 모든 프로젝트에 대해 이 작업을 수행해야 하며 .c
makefile에 파일 이름을 쓰지 않고 자동으로 만들려고 한다는 것입니다. 사용해 보았지만 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
이제 끝났습니다.