UECIDE: ошибка компоновщика с библиотекой U8g2

Этот скетч:

#include <SPI.h>
#include <Wire.h>
#include <U8g2lib.h>

// OLED-дисплей.
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);    
void setup() {
  u8g2.begin();
}    
void loop() {  
}

Скомпилировать OK с Arduino 1.8.3, но в UECIDE 0.8.9-pre15 не удается связать, с этим сообщением:

Compiling...
• Preprocessing...
• Compiling sketch...
• Compiling core...
‣ arduino
• Compiling libraries...
‣ U8g2 [/home/look/Documents/UECIDE/libraries/U8g2]
‣ SPI [/home/look/.uecide/libraries/Communications/arduino/SPI]
‣ U8g2 [/home/look/Documents/UECIDE/libraries/U8g2]
‣ Wire [/home/look/.uecide/libraries/Communications/arduino/Wire]
• Linking sketch...
/tmp/build-47290781-bacc-48e0-bc90-833910b26209/borrar.cpp.o: In function `U8G2::write(unsigned char)':
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:248: undefined reference to `u8g2_DrawGlyph'
/tmp/build-47290781-bacc-48e0-bc90-833910b26209/borrar.cpp.o: In function `U8G2::initDisplay()':
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:101: undefined reference to `u8x8_InitDisplay'
/tmp/build-47290781-bacc-48e0-bc90-833910b26209/borrar.cpp.o: In function `U8G2::clearDisplay()':
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:104: undefined reference to `u8g2_ClearDisplay'
/tmp/build-47290781-bacc-48e0-bc90-833910b26209/borrar.cpp.o: In function `U8G2::setPowerSave(unsigned char)':
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:107: undefined reference to `u8x8_SetPowerSave'
/tmp/build-47290781-bacc-48e0-bc90-833910b26209/borrar.cpp.o: In function `U8G2':
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:62: undefined reference to `u8x8_ascii_next'
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:62: undefined reference to `u8x8_ascii_next'
/tmp/build-47290781-bacc-48e0-bc90-833910b26209/borrar.cpp.o: In function `U8G2::home()':
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:278: undefined reference to `u8x8_utf8_init'
/tmp/build-47290781-bacc-48e0-bc90-833910b26209/borrar.cpp.o: In function `U8G2_SSD1306_128X64_NONAME_1_HW_I2C':
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:679: undefined reference to `u8g2_cb_r0'
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:679: undefined reference to `u8g2_cb_r0'
/home/look/Documents/UECIDE/libraries/U8g2/src/U8g2lib.h:679: undefined reference to `u8g2_Setup_ssd1306_i2c_128x64_noname_1'
collect2: error: ld returned 1 exit status
Compiling Fail

Обе IDE настроены на Arduino Pro Mini 3,3 В, 8 МГц. В UECIDE я использую GCC 4.9.2 для AVR. Я скопировал один и тот же исходный код U8g2 в каталог собственных библиотек Arduino и UECIDE.

Библиотека U8g2 версии 2.15.2 от Oliver установлена через Arduino IDE и скопирована в каталог библиотек UECIDE,

Пока проблема возникает только с U8g2, а не с другими библиотеками.

Как решить эту проблему?

, 👍0

Обсуждение

Можете ли вы предоставить ссылку на точную версию библиотеки U8g2, которую вы используете?, @Majenko

Понятно. Макет этой библиотеки представляет собой полный беспорядок и использует нестандартное расположение папок, которое не нравится UECIDE. Хотя почистить его достаточно просто. Я покажу вам, как., @Majenko


1 ответ


Лучший ответ:

1

Макет этой библиотеки имеет нестандартный формат с папками, которые UECIDE не знает, что искать и как с ними обращаться.

Основной причиной является включение больших фрагментов кода в каталог "clib" (с какой стати?!?!), который не включается в компиляцию. Кроме того, у вас есть файлы заголовков, на которые ссылаются как внутри, так и снаружи.

Самое простое решение — просто скопировать и переместить файлы в более удобные места:

$ cd ~/Documents/UECIDE/libraries/U8g2/src
$ mv clib/*.c .
$ cp clib/*.h .

Обратите внимание, что вы перемещаете источник, но копируете заголовки. Это сделано для того, чтобы обойти проблему ссылок на заголовки из двух мест с относительными путями.

Проблема возникает из-за того, что UECIDE имеет (по необходимости) гораздо более строгие правила, чем Arduino IDE, в отношении компоновки библиотеки. Это облегчает идентификацию и категоризацию библиотек, чтобы можно было рекурсивно обнаруживать зависимости.

,

Arduino IDE очень небрежно относится к своим правилам. UECIDE гораздо более строг в своих правилах. UECIDE применяет то, что указывает Arduino, но поскольку Arduino на самом деле все равно, люди не всегда следуют этим правилам. Они сделали его более сложным и запутанным, добавив этот новый формат библиотеки для кросс-архитектурных библиотек, который просто противен., @Majenko

Другая большая часть проблемы заключается в том, что, поскольку среда разработки Arduino IDE была настолько легкомысленной со своими собственными правилами, эти правила никогда и нигде не были строго определены. Так что это в значительной степени «лучшая догадка» о том, что следует и не следует делать. Например: когда вы рекурсивно используете исходную папку, а когда нет? В старом формате библиотеки этого делать нельзя, потому что исходная папка является корневой. В более новом формате 1.5.x вы, возможно, могли бы, но должны ли вы? Это не определено., @Majenko

Я работаю над улучшением процедуры поиска файлов для библиотек - заставить ее работать лучше для новых библиотек стилей., @Majenko