Having a *really* tough time understanding how to make/link my own libraries
Hello, I've been learning how to program my arduino bare-metal, and I've gotten to the point where I thought it'd be more convenient to start making my own library for interacting with some components. However, I've hit a roadblock at actually linking my library code to my project code.
My current library looks like this:
├── build
│ └── usb.o
├── etc
│ ├── lcd.h
│ ├── myavr.h
│ ├── rustypes.h
│ ├── shreg.h
│ └── spi.h
├── include
│ ├── usart.h
│ └── usb.h
├── lib
│ └── libusart.a
├── Makefile
└── USART
└── usb.c
Where /etc/ is just a placeholder for some headers that need refactoring. The makefile of this library looks like this:
# Variables
CPU = atmega328p
F_CPU = 16000000UL
CC = avr-gcc
ar = avr-ar
# Flags
CFLAGS = -Os
CPUFLAGS = -DF_CPU=$(F_CPU) -mmcu=$(CPU)
# Makers
usart.a: USART/usb.c
$(CC) $(CFLAGS) $(CPUFLAGS) -c USART/usb.c -o build/usb.o
$(ar) rcs lib/libusart.a $(wildcard build/*.o)
clear:
rm -r build/*
rm -r lib/*
Furthermore, I have a symbolic link in ~/lib/libusart.a to the actual library in this directory, for convenience.
However, when I try to compile my project, I get the following error:
Creating build directory...
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -I~/Documents/Arduino/MyAvrLib/ -c src/main.c -o build/main.o
avr-gcc -DF_CPU=16000000UL -mmcu=atmega328p -L~/lib -lusart build/main.o -o build/main.bin
build/main.o: In function `main':
main.c:(.text.startup+0x1c): undefined reference to `USB_init'
main.c:(.text.startup+0x3e): undefined reference to `USB_send_str'
collect2: error: ld returned 1 exit status
make: *** [Makefile:16: sketch] Error 1
My makefile for this project looks like:
CPU = atmega328p
CPU_CLOCK = 16000000UL
Device = /dev/ttyUSB0
CFLAGS = -Os
CPUFLAGS = -DF_CPU=$(CPU_CLOCK) -mmcu=$(CPU)
LIBRARIES = -L$(HOME)/lib -lusart
INCLUDES = -I$(HOME)/Documents/Arduino/MyAvrLib/
###################
# USER CONFIG END #
###################
sketch: src/main.c dir
avr-gcc $(CFLAGS) $(CPUFLAGS) $(INCLUDES) -c src/main.c -o build/main.o
avr-gcc $(CPUFLAGS) $(LIBRARIES) build/main.o -o build/main.bin
avr-objcopy -O ihex -R .eeprom build/main.bin build/main.hex
@echo "Hex image successfully created..."
dir: src/main.c
@echo "Creating build directory..."
@mkdir -p build/
flash: sketch
sudo avrdude -c arduino -p $(CPU) -P $(Device) -U flash:w:build/main.hex
@echo "Sketch flash successful..."
clear:
rm -rf build/
I'm genuinely at a loss for what I'm doing wrong. I've tried looking things up, but the avr nongnu guide on making libraries (https://www.nongnu.org/avr-libc/user-manual/library.html) has no examples, so I have nothing to check against. Help would be greatly appreciated!