#c #gnu-make
Вопрос:
У меня есть проект с использованием STM32F103C8T6. В нем есть дерево:
__main.c |__main.h |__led.c |__led.h |__stm32f1xx_startup.c |__Makefile
Я использую arm-none-eabi-gcc для компиляции этого проекта. Makefile
как показано ниже:
CC = arm-none-eabi-gcc MARCH = cortex-m3 CFLAGS = -c -mcpu=$(MARCH) -mthumb -std=gnu11 -Wall -O0 RM = rm -rf OBJS = $(patsubst %.c,%.o,$(wildcard *.c)) INCS = $(wildcard *.h) all: $(OBJS) $(CC) $(CFLAGS) $lt; -o $@ %.o: %.c %.h $(CC) $(CFLAGS) $lt; -o $@ .PHONY: clean clean: $(RM) *.o all
Когда я запускаю make
команду с помощью терминала VS Code,она не генерирует файл выполнения и имеет предупреждение, подобное этому:
minh@Minh:~/Workspaces/Stm32/BeraMetal$ make arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 main.c -o main.o arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 -c -o stm32f1xx_startup.o stm32f1xx_startup.c arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 led.c -o led.o arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 main.o -o all arm-none-eabi-gcc: warning: main.o: linker input file unused because linking not done
Пожалуйста, скажите мне, как я могу это исправить? Заранее благодарю.
Комментарии:
1. Прежде всего, ваше
all
правило в файле makefile назовет выходной файлall
. Во-вторых, вашеall
правило будет связывать (когда вы исправите ошибку компоновщика) только первый объектный файл в программеall
.
Ответ №1:
Вы используете одни и те же флаги для обеих компиляций в объектные файлы, как и при попытке связать объектные файлы вместе.
Проблема в том, что команда связывания затем будет использовать -c
флаги, которые используются для создания объектных файлов.
Вам нужно разделить флаги компиляции и компоновщика. Или, по крайней мере, не указывать -c
в CFLAGS
.
Ответ №2:
как я могу это исправить?
Не переходите -c
к этапу связывания. Кроме того, вы должны передать все объекты компоновщику.
CFLAGS = -mcpu=$(MARCH) -mthumb -std=gnu11 -Wall -O0 all: $(OBJS) $(CC) $(CFLAGS) $^ -o $@ %.o: %.c %.h $(CC) $(CFLAGS) -c $lt; -o $@
Подумайте о том, чтобы использовать что — то новее, чем дедушкин макияж CMake
Scons
Meson
.
Комментарии:
1. в нем есть ошибка:
minh@Minh:~/Workspaces/Stm32/BeraMetal$ make arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 -c main.c -o main.o arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 -c -o stm32f1xx_startup.o stm32f1xx_startup.c arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 -c led.c -o led.o arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 main.o -o all /home/minh/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux/gcc-arm-none-eabi-10.3-2021.07/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld:
2.
/home/minh/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux/gcc-arm-none-eabi-10.3-2021.07/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(lib_a-exit.o): in function
выход’: выход.c:(.text.exit 0x16): неопределенная ссылка на_exit' /home/minh/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux/gcc-arm-none-eabi-10.3-2021.07/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: main.o: in function
main’:`3.
main.c:(.text 0x2a): undefined reference to
hal_gpio_ написание/home/minh/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux/gcc-arm-none-eabi-10.3-2021.07/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: main.c:(.text 0x36): неопределенная ссылка наHAL_GPIO_WritePin' collect2: error: ld returned 1 exit status make: *** [Makefile:15: all] Error 1
4.
undefined reference to _exit
исследуйте, что такое newlib и nosys.specs и что он делает.undefined reference to HAL_GPIO_WritePin
ну, это не значит, что вы можете вызвать любую функцию из своего кода, и она будет работать, вы должны связать с ней. Чтобы установить связь с библиотеками STM32 HAL, вам необходимо загрузить и скомпилировать их, а также установить связь с ними. Исследуйте, что такое неопределенная ссылка и что она означает.