I'm having issues of linkage between my main.c and my self-defined library files

So, when I put my header file (and its related .c file) in the “include” folder, I get this error

Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/uno.html
PLATFORM: Atmel AVR (3.3.0) > Arduino Uno
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 31.50KB Flash
DEBUG: Current (avr-stub) On-board (avr-stub, simavr)
PACKAGES:
 - framework-arduino-avr 5.1.0
 - toolchain-atmelavr 1.70300.191015 (7.3.0)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 6 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Compiling .pio\build\uno\src\main.c.o
Archiving .pio\build\uno\libFrameworkArduinoVariant.a
Compiling .pio\build\uno\FrameworkArduino\CDC.cpp.o
Compiling .pio\build\uno\FrameworkArduino\HardwareSerial.cpp.o
src\main.c: In function 'main':
src\main.c:55:11: warning: unused variable 'adcVal' [-Wunused-variable]
  uint16_t adcVal = adcConvert();
Compiling .pio\build\uno\FrameworkArduino\HardwareSerial0.cpp.o
           ^~~~~~
Compiling .pio\build\uno\FrameworkArduino\HardwareSerial1.cpp.o
Compiling .pio\build\uno\FrameworkArduino\HardwareSerial2.cpp.o
Compiling .pio\build\uno\FrameworkArduino\HardwareSerial3.cpp.o
Compiling .pio\build\uno\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\uno\FrameworkArduino\PluggableUSB.cpp.o
Compiling .pio\build\uno\FrameworkArduino\Print.cpp.o
Compiling .pio\build\uno\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\uno\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\uno\FrameworkArduino\USBCore.cpp.o
Compiling .pio\build\uno\FrameworkArduino\WInterrupts.c.o
Compiling .pio\build\uno\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\uno\FrameworkArduino\WString.cpp.o
Compiling .pio\build\uno\FrameworkArduino\abi.cpp.o
Compiling .pio\build\uno\FrameworkArduino\hooks.c.o
Compiling .pio\build\uno\FrameworkArduino\main.cpp.o
Compiling .pio\build\uno\FrameworkArduino\new.cpp.o
Compiling .pio\build\uno\FrameworkArduino\wiring.c.o
Compiling .pio\build\uno\FrameworkArduino\wiring_analog.c.o
Compiling .pio\build\uno\FrameworkArduino\wiring_digital.c.o
Compiling .pio\build\uno\FrameworkArduino\wiring_pulse.S.o
Compiling .pio\build\uno\FrameworkArduino\wiring_pulse.c.o
Compiling .pio\build\uno\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\uno\libFrameworkArduino.a
Linking .pio\build\uno\firmware.elf
C:\Users\class\AppData\Local\Temp\ccqy0WB0.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0x0): undefined reference to `adcConfig'
<artificial>:(.text.startup+0x4): undefined reference to `adcConvert'
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\uno\firmware.elf] Error 1
================================================================================================== [FAILED] Took 7.39 seconds ==================================================================================================
The terminal process "C:\Users\class\.platformio\penv\Scripts\platformio.exe 'run', '--environment', 'uno'" terminated with exit code: 1.

This is what my project folders look like:
Linkage_Error

Atmega328p_ADC.h contains the function prototypes and Atmega328p_ADC.c has the function definitions. The functions I call from this library from inside main are what I get errors for.

1 Like

You put a .c file in include/ – that won’t work. Files in include/ are only put in the -I include path, and are not compiled. Put the Atmega328p_ADC.c in src/ or put both ADC files in a subfolder in lib/ to make it a proper library.

1 Like

Thank you for your help!