Library in /lib being compiled and linked. Undefined references occur

I am trying to use my libft library that I wrote in 42 school to help me work with c strings.
The library is written fully in C99 and has no dependencies other than the standard C library

This is my file structure
image

When I build the project, it looks like it properly compiles the entire library, indexes it, and links it. However, I still get an error when the final compilation is done. Here’s the full log:

Processing megaatmega2560 (platform: atmelavr; board: megaatmega2560; framework: arduino)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/megaatmega2560.html
PLATFORM: Atmel AVR (4.2.0) > Arduino Mega or Mega 2560 ATmega2560 (Mega 2560)
HARDWARE: ATMEGA2560 16MHz, 8KB RAM, 248KB Flash
DEBUG: Current (avr-stub) External (avr-stub, simavr)
PACKAGES: 
 - framework-arduino-avr @ 5.1.0 
 - tool-avrdude @ 1.60300.200527 (6.3.0) 
 - toolchain-atmelavr @ 1.70300.191015 (7.3.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 6 compatible libraries
Scanning dependencies...
Dependency Graph
|-- ft @ 1.0.0
Building in release mode
Compiling .pio/build/megaatmega2560/src/buzzer.cpp.o
Compiling .pio/build/megaatmega2560/src/cmd.cpp.o
Compiling .pio/build/megaatmega2560/src/main.cpp.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_arradd_back.c.o
src/cmd.cpp: In constructor 'Cmd::Cmd()':
src/cmd.cpp:18:32: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
     commands[0] = {"ping", ping};
                                ^
src/cmd.cpp:19:34: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
     commands[1] = {"align", align};
                                  ^
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_atoi.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_bzero.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_calloc.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_charpp_cpy.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_charpp_free.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_charpp_len.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_charpp_nfree.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_isalnum.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_isalpha.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_isascii.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_isdigit.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_isdigit_str.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_isprint.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_isspace_str.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_itoa.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstadd_back.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstadd_front.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstclear.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstdelone.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstiter.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstlast.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstmap.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstnew.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstprint.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_lstsize.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_memchr.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_memcmp.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_memcpy.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_memmove.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_memset.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_split.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strchr.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strcmp.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strdup.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_striteri.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strjoin.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strlcat.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strlcpy.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strlen.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strmapi.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strncmp.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strnstr.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strrchr.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_strtrim.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_substr.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_tolower.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/ft_toupper.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/get_next_line_bonus.c.o
Compiling .pio/build/megaatmega2560/lib3a5/ft/get_next_line_utils_bonus.c.o
Archiving .pio/build/megaatmega2560/libFrameworkArduinoVariant.a
Indexing .pio/build/megaatmega2560/libFrameworkArduinoVariant.a
Compiling .pio/build/megaatmega2560/FrameworkArduino/CDC.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/HardwareSerial.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/HardwareSerial0.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/HardwareSerial1.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/HardwareSerial2.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/HardwareSerial3.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/IPAddress.cpp.o
Archiving .pio/build/megaatmega2560/lib3a5/libft.a
Compiling .pio/build/megaatmega2560/FrameworkArduino/PluggableUSB.cpp.o
Indexing .pio/build/megaatmega2560/lib3a5/libft.a
Compiling .pio/build/megaatmega2560/FrameworkArduino/Print.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/Stream.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/Tone.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/USBCore.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/WInterrupts.c.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/WMath.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/WString.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/abi.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/hooks.c.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/main.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/new.cpp.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/wiring.c.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/wiring_analog.c.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/wiring_digital.c.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/wiring_pulse.S.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/wiring_pulse.c.o
Compiling .pio/build/megaatmega2560/FrameworkArduino/wiring_shift.c.o
Archiving .pio/build/megaatmega2560/libFrameworkArduino.a
Indexing .pio/build/megaatmega2560/libFrameworkArduino.a
Linking .pio/build/megaatmega2560/firmware.elf
/tmp/ccdYXqHV.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0x2ae): undefined reference to `ft_strnstr(char const*, char const*, unsigned int)'
collect2: error: ld returned 1 exit status
*** [.pio/build/megaatmega2560/firmware.elf] Error 1
============================================================================================================================================ [FAILED] Took 1.71 seconds ============================================================================================================================================

Here are the contents of the library.json and platformio.ini files:

{
  "name": "ft",
  "version": "1.0.0",
  "build": {
    "srcDir": "./src",
    "includeDir": "./include"
  }
}
[env:megaatmega2560]
platform = atmelavr
board = megaatmega2560
framework = arduino
lib_deps = ft

Compiling the library iself with the makefile works fine, and I can then use it with other projects without issues, and the code of the arduino project compiles without issues if I don’t call any functions from the library.

Why is this happening?

And where is that ft_strnstr() function defined? In a C file? Are you sure you’re using the #ifdef __cplusplus pattern in the .h files to properly expose this function to C++ files? https://stackoverflow.com/questions/3789340/combining-c-and-c-how-does-ifdef-cplusplus-work

Oh! I didn’t know I needed to do that to allow C++ code to use C functions. Thank you very much!