Private lib compilation fails

Hi all,

I am currently in a struggle with “private lib” compilation.

Here is the log:

fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ platformio run
*********************************************************************************************************************************************
Obsolete PIO Core v3.4.1 is used (previous was 3.5.0a16)
Please remove multiple PIO Cores from a system:
http://docs.platformio.org/page/faq.html#multiple-pio-cores-in-a-system
*********************************************************************************************************************************************
[Fri Oct  6 21:11:40 2017] Processing nodemcuv2 (platform: espressif8266; board: nodemcuv2; framework: arduino)
---------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
Collected 24 compatible libraries
Looking for dependencies...
Library Dependency Graph
|-- <utils>
Compiling .pioenvs/nodemcuv2/src/main.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/HardwareSerial.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/IPAddress.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/MD5Builder.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Print.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Schedule.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Stream.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/StreamString.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Tone.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Updater.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/WMath.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/WString.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/abi.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/base64.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/cbuf.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/cont.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/cont_util.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_eboot_command.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_flash_utils.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_i2s.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_main.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_noniso.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_phy.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_postmortem.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_si2c.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_timer.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_analog.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_digital.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_pulse.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_pwm.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_shift.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/debug.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/heap.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/libb64/cdecode.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/libb64/cencode.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/libc_replacements.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/pgmspace.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/setjmp.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_cache.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_check.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_gc.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_hydrogen.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_nucleus.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs_api.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs_hal.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/time.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/uart.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/umm_malloc/umm_malloc.o
Compiling .pioenvs/nodemcuv2/lib/utils/utils.o
Archiving .pioenvs/nodemcuv2/lib/libutils.a
Indexing .pioenvs/nodemcuv2/lib/libutils.a
Archiving .pioenvs/nodemcuv2/libFrameworkArduino.a
Indexing .pioenvs/nodemcuv2/libFrameworkArduino.a
Linking .pioenvs/nodemcuv2/firmware.elf
.pioenvs/nodemcuv2/src/main.o:(.text.setup+0x0): undefined reference to `setup_builtin_led()'
.pioenvs/nodemcuv2/src/main.o: In function `setup':
main.cpp:(.text.setup+0xa): undefined reference to `setup_builtin_led()'
.pioenvs/nodemcuv2/src/main.o:(.text.loop+0x0): undefined reference to `ImAlive()'
.pioenvs/nodemcuv2/src/main.o: In function `loop':
main.cpp:(.text.loop+0xa): undefined reference to `ImAlive()'
collect2: error: ld returned 1 exit status
*** [.pioenvs/nodemcuv2/firmware.elf] Error 1
========================================================= [ERROR] Took 5.03 seconds =========================================================


Project_name
├── lib
│   ├── readme.txt
│   └── utils
│       ├── utils.c
│       └── utils.h
├── platformio.ini
└── src
    └── main.cpp

3 directories, 5 files

fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ cat src/main.cpp 

#include <Arduino.h>
#include <utils.h>

void setup() {
  setup_builtin_led();
}

void loop() {
    // put your main code here, to run repeatedly:
    ImAlive();
}
fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ cat lib/utils/*

#include <Arduino.h>

void setup_builtin_led(void){
  digitalWrite(LED_BUILTIN, HIGH);
  pinMode(LED_BUILTIN, OUTPUT);
}

void ImAlive(void){
  digitalWrite(BUILTIN_LED, LOW);
  delay(100);
  digitalWrite(BUILTIN_LED, HIGH);
  delay(400);
}


/* PROJ_UTILS_H */

#ifndef PROJ_UTILS_H
#define PROJ_UTILS_H

void setup_builtin_led(void);
void ImAlive(void);


#endif /* PROJ_UTILS_H */

I am wondering what is false as I followed instructions given in the libs/README,
but I have no clue of what is wrong…

I have to say that it may be a dumb error, as I did not write a single code line since a looong time now…

Thank you for your help !

Try renaming your ‘utils’ files to ‘myUtils’. Might be a conflict.

Hi John,

I tried to reinstall platformio, as I had a message about “not-up-to-date” version.
But it doesn’t change anything.

I tried what you asked me, changing names, but the same issue occurs:

fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ platformio run
*****************************************************************************************************************************************
If you like PlatformIO, please:
- follow us on Twitter to stay up-to-date on the latest project news > https://twitter.com/PlatformIO_Org
- star it on GitHub > https://github.com/platformio/platformio
- try PlatformIO IDE for IoT development > http://platformio.org/platformio-ide
- support us with PlatformIO Plus > https://pioplus.com
*****************************************************************************************************************************************

[Sun Oct  8 18:53:26 2017] Processing nodemcuv2 (platform: espressif8266; board: nodemcuv2; framework: arduino)
-----------------------------------------------------------------------------------------------------------------------------------------
PlatformManager: Installing espressif8266
Downloading  [####################################]  100%
Unpacking  [####################################]  100%
espressif8266 @ 1.4.0 has been successfully installed!
The platform 'espressif8266' has been successfully installed!
The rest of packages will be installed automatically depending on your build environment.
PackageManager: Installing toolchain-xtensa @ ~1.40802.0
Downloading  [####################################]  100%          
Unpacking  [####################################]  100%          
PackageManager: Installing tool-esptool @ ~1.409.0
Downloading  [####################################]  100%
Unpacking  [####################################]  100%
PackageManager: Installing framework-arduinoespressif8266 @ ~1.20300.1
Downloading  [####################################]  100%
Unpacking  [####################################]  100%
CorePackageManager: Installing tool-scons @ ~3.20501.2
Downloading  [####################################]  100%
Unpacking  [####################################]  100%
tool-scons @ 3.20501.2 has been successfully installed!
Verbose mode can be enabled via `-v, --verbose` option
Collected 24 compatible libraries
Looking for dependencies...
Library Dependency Graph
|-- <myUtils>
Compiling .pioenvs/nodemcuv2/src/main.o
Archiving .pioenvs/nodemcuv2/libFrameworkArduinoVariant.a
Indexing .pioenvs/nodemcuv2/libFrameworkArduinoVariant.a
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Esp.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/FS.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/HardwareSerial.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/IPAddress.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/MD5Builder.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Print.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Schedule.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Stream.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/StreamString.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Tone.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/Updater.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/WMath.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/WString.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/abi.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/base64.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/cbuf.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/cont.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/cont_util.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_eboot_command.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_flash_utils.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_i2s.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_main.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_noniso.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_phy.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_postmortem.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_si2c.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_timer.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_analog.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_digital.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_pulse.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_pwm.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/core_esp8266_wiring_shift.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/debug.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/heap.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/libb64/cdecode.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/libb64/cencode.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/libc_replacements.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/pgmspace.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/setjmp.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_cache.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_check.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_gc.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_hydrogen.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs/spiffs_nucleus.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs_api.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/spiffs_hal.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/time.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/uart.o
Compiling .pioenvs/nodemcuv2/FrameworkArduino/umm_malloc/umm_malloc.o
Compiling .pioenvs/nodemcuv2/lib/myUtils/myUtils.o
Archiving .pioenvs/nodemcuv2/lib/libmyUtils.a
Indexing .pioenvs/nodemcuv2/lib/libmyUtils.a
Archiving .pioenvs/nodemcuv2/libFrameworkArduino.a
Indexing .pioenvs/nodemcuv2/libFrameworkArduino.a
Linking .pioenvs/nodemcuv2/firmware.elf
.pioenvs/nodemcuv2/src/main.o:(.text.setup+0x0): undefined reference to `setup_builtin_led()'
.pioenvs/nodemcuv2/src/main.o: In function `setup':
main.cpp:(.text.setup+0xa): undefined reference to `setup_builtin_led()'
.pioenvs/nodemcuv2/src/main.o:(.text.loop+0x0): undefined reference to `ImAlive()'
.pioenvs/nodemcuv2/src/main.o: In function `loop':
main.cpp:(.text.loop+0xa): undefined reference to `ImAlive()'
collect2: error: ld returned 1 exit status
*** [.pioenvs/nodemcuv2/firmware.elf] Error 1
====================================================== [ERROR] Took 27.66 seconds ======================================================
fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ tree
.
├── lib
│   ├── myUtils
│   │   ├── myUtils.c
│   │   └── myUtils.h
│   └── readme.txt
├── platformio.ini
└── src
└── main.cpp

3 directories, 5 files
fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ cat lib/myUtils/myUtils.c

#include <Arduino.h>

void setup_builtin_led(void){
  digitalWrite(LED_BUILTIN, HIGH);
  pinMode(LED_BUILTIN, OUTPUT);
}

void ImAlive(void){
  digitalWrite(BUILTIN_LED, LOW);
  delay(100);
  digitalWrite(BUILTIN_LED, HIGH);
  delay(400);
}
fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ cat lib/myUtils/myUtils.h
/* MYUTILS_H */

#ifndef MYUTILS_H
#define MYUTILS_H

void setup_builtin_led(void);
void ImAlive(void);


#endif /* MYUTILS_H */

fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ cat src/main.cpp 

#include <Arduino.h>
#include <myUtils.h>

void setup() {
  setup_builtin_led();
}

void loop() {
// put your main code here, to run repeatedly:
ImAlive();
}

Apparently, it seems to detect and compile my lib, so would the issue be during linking ?

I did not modify default platformio.ini file which is the following:

fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ cat platformio.ini 
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; http://docs.platformio.org/page/projectconf.html

[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino

I found this in PIO docs. It appears “LED_BUILTIN” might not be defined for that board. Make sure you set the led pin correctly for your board. Hope it works.

#include “Arduino.h”

#ifndef LED_BUILTIN
#define LED_BUILTIN 13
#endif

OK,

So I was missing the basics…
I am compiling C files in what seems to be a CPP project.

adding the “extern “C” { }” directive lets me now compiling fine:

fxois@ThinkPad-T420:~/Documents/PlatformIO/Projects/bip_portail$ cat lib/myUtils/myUtils.h
/* MYUTILS_H */

#ifndef MYUTILS_H
#define MYUTILS_H

#ifdef __cplusplus
extern "C" {
#endif

void setup_builtin_led(void);
void ImAlive(void);

#ifdef __cplusplus
}
#endif

#endif /* MYUTILS_H */

Thank you !