c - AVR GCC - 使用静态库 - undefined reference 错误

标签 c avr atmega avr-gcc

我目前正在尝试使用 AVR atmega328p 读取温度传感器 (Dallas ds18b20) 的值。为了读取值,我需要导入外部库( using this one )。我使用外部存储库中的 Makefile 创建静态库(lib 目录中的 libds18b20.a)。我还将头文件添加到我自己的源代码中。我有以下 Makefile:

PORT_ID=/dev/ttyACM0
MCU=atmega328p
F_CPU=1200000
CC=avr-gcc
PROGRAMMER_ID=stk500v1
OBJCOPY=avr-objcopy
CFLAGS=-std=c99 -Wall -g -Os -mmcu=${MCU} -DF_CPU=${F_CPU} -I.
TARGET=main
SRCS=main.c
BAUD_RATE=19200
PATH_DS18B20=./lib

all:
    ${CC} -L ${PATH_DS18B20} ${CFLAGS} -o ${TARGET}.bin ${SRCS}
    ${OBJCOPY} -j .text -j .data -O ihex ${TARGET}.bin ${TARGET}.hex

flash:
    avrdude -v -P ${PORT_ID} -b ${BAUD_RATE} -c ${PROGRAMMER_ID} -p ${MCU} -U flash:w:${TARGET}.hex

clean:
    rm -f *.bin *.hex

但是,当我尝试运行此 Makefile 时,出现以下错误(输出部分省略):

/main.c:(.text.startup+0x2e): undefined reference to `ds18b20convert'
/main.c:60: undefined reference to `ds18b20read'

这些函数在头文件中定义。我预计静态库未正确链接。我在这里做错了什么?

最佳答案

我设法通过省略 -L 标志并将路径直接放在 ${SRCS} 变量后面(包括静态库的名称)来实现此功能:

PORT_ID=/dev/ttyACM0
MCU=atmega328p
F_CPU=1200000
CC=avr-gcc
PROGRAMMER_ID=stk500v1
OBJCOPY=avr-objcopy
CFLAGS=-std=c99 -Wall -g -Os -mmcu=${MCU} -DF_CPU=${F_CPU} -I.
TARGET=main
SRCS=main.c
BAUD_RATE=19200
PATH_DS18B20=./lib/libds18b20.a

all:
    ${CC} ${CFLAGS} -o ${TARGET}.bin ${SRCS} ${PATH_DS18B20}
    ${OBJCOPY} -j .text -j .data -O ihex ${TARGET}.bin ${TARGET}.hex

flash:
    avrdude -v -P ${PORT_ID} -b ${BAUD_RATE} -c ${PROGRAMMER_ID} -p ${MCU} -U flash:w:${TARGET}.hex

clean:
    rm -f *.bin *.hex

关于c - AVR GCC - 使用静态库 - undefined reference 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57811300/

相关文章:

c - 为什么在 C 中调用函数时要指定函数的返回类型?

c - 指针内存错误

c - C 中的一个空循环。编译器是否生成了很多不必要的代码,或者我错过了什么?

arduino - ATmega328 + SPI 闪存

c - 释放内存时出现段错误

c - 在c中打印同一行

c - 如何通过系统调用写入UNIX终端?

c - pgm_read_ 和 PROGMEM - 意外行为

c - C 多久/何时执行 if/else 语句中的内容?

c - 4 位 4x20 LCD,采用 Atmega32