AVR GCC-使用静态库-未定义参考错误

时间:2019-09-05 18:38:08

标签: c avr atmega avr-gcc

我目前正在尝试使用AVR atmega328p从温度传感器(达拉斯ds18b20)读取值。为了读取值,我需要导入一个外部库(using this one)。我已使用外部存储库中的Makefile来创建静态库(libds18b20.a目录中的lib)。我还将头文件添加到了自己的源文件中。我有以下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'

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

1 个答案:

答案 0 :(得分:0)

我设法通过省略-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