Библиотека не компилируется

Я хочу попробовать эту библиотеку: https://github.com/connornishijima/arduino-volume3

Я скачал zip-файл с github, переименовал его и включил в качестве библиотеки в IDE.

Поэтому запустите один из примеров, A4_440HZ Это его код:

#include "Volume3.h"
#define speakerPin 9

uint16_t frequency = 440;

void setup() {
  // Здесь ничего не нужно!
}

void loop() {  
  for(uint16_t volume = 0; volume < 1023; volume++){
    vol.tone(speakerPin,frequency,volume);
    delay(1);
  }
  for(uint16_t volume = 1023; volume > 0; volume--){
    vol.tone(speakerPin,frequency,volume);
    delay(1);
  }
}

И я получаю эту ошибку:

Error Compiling
A4_440Hz.cpp.o: In function `loop':
/usr/share/arduino/A4_440Hz.ino:12: undefined reference to `vol'
/usr/share/arduino/A4_440Hz.ino:12: undefined reference to `vol'
/usr/share/arduino/A4_440Hz.ino:16: undefined reference to `vol'
/usr/share/arduino/A4_440Hz.ino:16: undefined reference to `vol'
collect2: error: ld returned 1 exit status

Я понятия не имею, что виновато или как его смягчить.

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

, 👍-1

Обсуждение

Он компилируется здесь. Какая у вас версия IDE?, @timemage

Вы могли просто установить библиотеку из менеджера библиотек в Arduino IDE., @StarCat

Они используют extern Volume vol; в заголовочном файле, но определения нет ни в cpp, ни в скетче. Я полагаю, в вашем коде понадобится Volume vol;, @KIIV

Вторая часть этой библиотеки, TimerOne, использует тот же шаблон, но имеет как объявление в файле заголовка, так и определение в файле cpp [строка 41 TimerOne.cpp] (https://github.com/connornishijima/arduino-volume3). /blob/5fbc498038c83cb0f771c65e1e4cb02e4bf8415b/src/TimerOne.cpp#L41), @KIIV

@timemage Это 2: 1.0.5. У него нет менеджера библиотеки. Возможно, это старая версия? Но я установил его недавно. Я использую Ubuntu Linux., @user1584421

@ user1584421 Очень старая и распространенная проблема. Если вам интересно, 2: не является частью версии IDE. Это часть схемы управления версиями пакетов в стиле Debian. То, что вы видите, — это IDE версии 1.0.5 от 2013 года. Debian и Ubuntu могли бы сделать всем одолжение, удалив эти пакеты, но они этого не делают. Вместо этого распакуйте (при желании установите) из архива., @timemage


1 ответ


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

2

Странная ситуация. Библиотека объявляет объект vol, но не может его определить. На древней версии Arduino IDE вы используете, компиляция по понятным причинам завершается ошибкой, потому что vol имеет никогда не определялся. Странно, что в более поздней версии (1.8.15 для Ubuntu здесь), компиляция прошла успешно.

Стоит отметить, что vol принадлежит классу Volume, который является пустой класс. Таким образом, он играет только роль пространства имен для функции vol.tone() и vol.noTone(). Строго говоря, как vol не имеет данных (его размер равен нулю), компилятору не нужно обращаться к Это. Я предполагаю, что более новой Arduino удается скомпилировать только это потому что он использует другие настройки оптимизации, чем древний 1.0.5.

В любом случае у вас есть два варианта:

  • обновите установленную версию Arduino IDE

  • объявите Volume vol; в верхней части скетча.

Обновление: я провел несколько тестов, и оказалось, что, как я и подозревал, это связанных с оптимизацией времени компоновки (LTO). Начиная с версии 1.5.7, Arduino IDE включает LTO, и в этом случае компоновщик не жаловаться на отсутствие пустых объектов.

Библиотеку можно исправить, определив vol в Volume3.cpp, хотя это создало бы странный пустой объект в BSS. Другой вариант следует объявить оба метода как static в Volume3.h. Это сделало бы компилятор знает, что на самом деле ему не нужно ссылаться на объект vol когда вызывается один из его методов.

Не могли бы вы отправить запрос на включение одного из этих исправлений?

,

Благодарю вас! Я пробовал оба! Библиотека компилируется, но звука не слышно. Я думаю, это старая библиотека., @user1584421

То же самое относительно оптимизатора. Чтобы было ясно, код всегда был неправильным. Вопрос только в том, проявляется ли проблема из-за этого., @timemage

Итак, если я сделаю ваши предложения, будет ли работать библиотека? Вам удалось запустить его? Кстати, последнее предложение адресовано мне?, @user1584421

@user1584421: user1584421: Это должно работать, хотя я тестировал только пример кода с помощью моего хост-компилятора. И да, последнее предложение было предложением для вас., @Edgar Bonet

Спасибо. Но внутри Volume3.cpp я определил Volume vol;. Затем я использовал один из примеров. Библиотека скомпилирована / загружена, но из динамиков ничего не слышно., @user1584421