我尝试在avr-gcc 4.9.2定位atmega644的项目中使用avrfix library。
我已经在自述文件中描述了链接avrfix,但是我总是遇到错误,例如
/tmp/ccrUM5Bo.o: In function `imu_calc_gyro':
imu.c:(.text+0x1d8): undefined reference to `lmullkD'
collect2: error: ld returned 1 exit status
Makefile:35: recipe for target 'main.elf' failed
make: *** [main.elf] Error 1
我的avr-gcc调用是
avr-gcc -Wall -Os -fshort-enums -std=c11 -mmcu=$(C_DEVICE) -I$(CINCLUDE)-lavrfix -Wl,-Map=project.map,-L$(LIB_PATH) -o $(OBJDIR)/$@ $^
我认为链接器能够找到avrfix库,因为如果我错误地使用-lavrfix,那么(并且只有这样)链接器会抱怨它找不到库。
如果有人有任何想法,我会非常感激他们。
编辑:已解决!
对于任何有相同问题的人,我最终将编译阶段与Jonathan Leffler和之后的链接器阶段分开 user3629249建议。
我的Makefile的重要摘录:
CFLAGS = -Wall -Wextra -Os -fshort-enums -std=gnu11 -mmcu=$(C_DEVICE) -I$(CINCLUDE) -I.
LDFLAGS = -Map=$(OBJDIR)/drone.map -L/usr/avr/lib/ -L/usr/lib/gcc/avr/4.9.2/avr5/ -lavrfix -lc -lgcc -lm
main.elf: $(OBJS)
avr-ld $^ $(LDFLAGS) -o $(OBJDIR)/$@
$(OBJDIR)/%.o: $(SRCDIR)/%.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
然而,在Ignacio Vazquez-Abrams建议之后,我最终使用了_Frac
和_Accum
的gcc定点函数。为此,我不得不用--enable-fixed-point
标志重新编译我的avr-gcc。