u/Athropod101

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!

reddit.com
u/Athropod101 — 18 hours ago