Ошибка "collect2.exe: error: ld returned 1 exit status"

arduino-uno ir debugging platformio vscode

Я только на днях получил стартовый набор Elegoo UNO и изучал небольшие руководства по всем деталям, которые к нему прилагаются. Я использую VSCode с Platform.io плагин и (после его настройки) он работает нормально.

Код, с которым я сейчас борюсь, - это скетч, который должен использовать ИК-пульт дистанционного управления и приемник, поставляемый в комплекте, я продолжаю получать сообщение об ошибке: collect2.exe : ошибка: ld вернул 1 статус выхода

Я кое-что поискал в Интернете, но мне не очень повезло заставить что-нибудь работать.

Мой полный код приведен ниже:

char foo;

#include <Arduino.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <IR.h>

IRrecv irrecv(RECEIVER);     // создать экземпляр 'irrecv'
decode_results results;      // создать экземпляр 'decode_results'

void setup() {
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode");
  irrecv.enableIRIn();
}

void loop()
{
  int tmpValue;
  if (irrecv.decode(&results)) // получили ли мы ИК-сигнал?
  {
    for (int i = 0; i < 22; i++)
    {
      if ((keyValue[i] == results.value) && (i<KEY_NUM))
      {
        Serial.println(keyBuf[i]);
        tmpValue = results.value;
      }
      else if(REPEAT==i)
      {
        results.value = tmpValue;
      }
    }
    irrecv.resume(); // получить следующее значение
  }


// Эффект от реализации вышеуказанной программы составляет 
// то же, что и в следующем, но оно более краткое

// переключатель(результаты.значение)
//  {
// case 0xFFA25D: Serial.println("ПИТАНИЕ"); разрыв;
// case 0xFFE21D: Serial.println("ФУНКЦИЯ / ОСТАНОВКА"); разрыв;
// дело 0xFF629D: Serial.println("VOL +"); разрыв;
// case 0xFF22DD: Serial.println("БЫСТРЫЙ ВОЗВРАТ"); разрыв;
// case 0xFF02FD: Serial.println("ПАУЗА"); разрыв;
// case 0xFFC23D: Serial.println("БЫСТРАЯ ПЕРЕМОТКА ВПЕРЕД"); разрыв;
// case 0xFFE01F: Serial.println("ВНИЗ"); разрыв;
// случай 0xFFA857: Serial.println("VOL-"); разрыв;
// case 0xFF906F: Serial.println("ВВЕРХ"); разрыв;
// случай 0xFF9867: Serial.println("Эквалайзер"); разрыв;
// дело 0xFFB04F: Serial.println("ST / REPT"); разрыв;
// регистр 0xFF6897: Serial.println("0"); разрыв;
// case 0xFF30CF: Serial.println("1"); разрыв;
// случай 0xFF18E7: Serial.println("2"); разрыв;
// случай 0xFF7A85: Serial.println("3"); разрыв;
// case 0xFF10EF: Serial.println("4"); разрыв;
// дело 0xFF38C7: Serial.println("5"); разрыв;
// case 0xFF5AA5: Serial.println("6"); разрыв;
// case 0xFF42BD: Serial.println("7"); разрыв;
// case 0xFF4AB5: Serial.println("8"); разрыв;
// case 0xFF52AD: Serial.println("9"); разрыв;
// case 0xFFFFFFFF: Serial.println(" ПОВТОР");разрыв;  
// по умолчанию: 
// Serial.println(" другая кнопка");

  }// Конечный случай

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

include/IR.h:29:0: warning: "REPEAT" redefined
 #define REPEAT 22
 ^
In file included from src\main.cpp:4:0:
include/IRremote.h:57:0: note: this is the location of the previous definition
 #define REPEAT 0xffffffff
 ^
In file included from src\main.cpp:6:0:
include/IR.h:36:78: warning: initializer-string for array of chars is too long [-fpermissive]
                   "UP","EQ","ST/REPT","0","1","2","3","4","5","6","7","8","9"};
                                                                              ^
Linking .pio\build\uno\firmware.elf
C:\Users\wiley\AppData\Local\Temp\ccDVm6mB.ltrans0.ltrans.o: In function `global constructors keyed to 65535_0_main.cpp.o.1820':
<artificial>:(.text.startup+0x60): undefined reference to `IRrecv::IRrecv(int)'
C:\Users\wiley\AppData\Local\Temp\ccDVm6mB.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0x160): undefined reference to `IRrecv::enableIRIn()'
<artificial>:(.text.startup+0x16c): undefined reference to `IRrecv::decode(decode_results*)'
<artificial>:(.text.startup+0x1c6): undefined reference to `IRrecv::resume()'
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\uno\firmware.elf] Error 1

Я не понимаю, какие ошибки, о которых он мне сообщает, находятся в файле IR.h. В нем говорится, что ПОВТОР переопределен, но он определен только один раз в файле. Что касается неопределенной ссылки на IRrecv :: Я не понимаю, потому что у меня есть все необходимые файлы в папке "Include", и когда я нажимаю CTRL на эти функции в редакторе, это приводит меня к файлам и показывает мне код ... так почему он не может найти код, когда я запустить его?

ИК.ч:

#ifndef _IR_H
#define _IR_H

#define RECEIVER 11

#define KEY_POWER (0xFFA25D)
#define KEY_FUNC_STOP (0xFFE21D)
#define KEY_VOL_ADD (0xFF629D)
#define KEY_FAST_BACK (0xFF22DD)
#define KEY_PAUSE (0xFF02FD)
#define KEY_FAST_FORWARD (0xFFC23D)
#define KEY_DOWN (0xFFE01F)
#define KEY_VOL_DE (0xFFA857)
#define KEY_UP (0xFF906F)
#define KEY_EQ (0xFF9867)
#define KEY_ST_REPT (0xFFB04F)
#define KEY_0 (0xFF6897)
#define KEY_1 (0xFF30CF)
#define KEY_2 (0xFF18E7)
#define KEY_3 (0xFF7A85)
#define KEY_4 (0xFF10EF)
#define KEY_5 (0xFF38C7)
#define KEY_6 (0xFF5AA5)
#define KEY_7 (0xFF42BD)
#define KEY_8 (0xFF4AB5)
#define KEY_9 (0xFF52AD)
#define KEY_REPEAT (0xFFFFFFFF)
#define KEY_NUM 21
#define REPEAT 22

unsigned long keyValue[]={KEY_POWER,KEY_FUNC_STOP,KEY_VOL_ADD,KEY_FAST_BACK,KEY_PAUSE,KEY_FAST_FORWARD,
                KEY_DOWN,KEY_VOL_DE,KEY_UP,KEY_EQ,KEY_ST_REPT,KEY_0,KEY_1,KEY_2,KEY_3,KEY_4,KEY_5,
                KEY_6,KEY_7,KEY_8,KEY_9,KEY_REPEAT};

char keyBuf[][10]={"POWER","FUNC/STOP","VOL+","FAST BACK","PAUSE","FAST FORWARD","DOWN","VOL-",
                  "UP","EQ","ST/REPT","0","1","2","3","4","5","6","7","8","9"};
#endif

Я много искал в Интернете, и, похоже, это обычная проблема с этой библиотекой IR.h, и ни одно из предложенных исправлений ни к чему меня не привело. (Я получаю те же результаты при попытке запустить этот скетч в среде IDE Arduino со всеми установленными библиотеками)

Я уже некоторое время занимаюсь разработкой на Java и Python, но у меня почти нет опыта работы с C или C ++ до Arduino, так что, возможно, это простая ошибка, которую я просто не понимаю. Супер неприятно!! Любая помощь или рекомендации будут оценены по достоинству! Спасибо

, 👍3

Обсуждение

"Реальными" сообщениями об ошибках являются строки "неопределенной ссылки". Компилятор (фактически компоновщик) не может найти файлы code (.cpp) для одной из библиотек (вероятно, несменяемый). Arduino IDE делает некоторые чудеса, чтобы позаботиться об этом автоматически, но я не знаком с VSCode или Platform.io . Поищите варианты включения библиотек где-нибудь в настройках вашего проекта или что-то в этом роде., @Mat

Кстати, предупреждение перед этим довольно смертельно опасно (ошибка повреждения памяти). Цикл должен быть настроен таким образом, чтобы он не выходил за пределы KeyValue ., @Mat

Я убедился, что все файлы .h и .cpp, которые я использую, находятся в папке "Включить" проекта, который работал с предыдущими файлами заголовков. Глупо, что он говорит, что не может найти код, потому что, если я нажму CTRL на методы в редакторе, это приведет меня прямо к файлу .cpp, в котором он находится, внутри папки "Include", поэтому я не понимаю, почему он не может найти его во время выполнения., @wileyrivers

Кроме того, я сократил цикл до 22, и эта проблема, связанная с циклом, исчезла, но появилось больше в отношении файлов .h. Обновит ОП, @wileyrivers

Вы не включаете файлы .cpp, вам нужно скомпилировать (а затем связать) их. Опять же, я не знаю ваших настроек, но файлы .cpp не должны находиться в настройках включения. Посмотрите, можете ли вы добавить дополнительные исходные файлы где-нибудь в настройках проекта., @Mat

Я уже все понял. PlatformIO имеет действительно удобный менеджер библиотек, который помогает с настройкой. Вы просто выбираете библиотеку, и она автоматически добавляет ее в выбранный вами проект и проверяет, указаны ли правильные зависимости в файле .ini. Спасибо вам за вашу помощь!, @wileyrivers

Вы можете взять свой комментарий и опубликовать вместо него ответ., @timemage

У меня была проблема с последовательной библиотекой, которая и вызвала эту проблему., @Georgi Peev


1 ответ


2

Я уже все понял.

Проблема заключалась в том, что я неправильно настроил проект с соответствующими библиотеками. Я думал, что делаю это правильно вручную, но это было не так. PlatformIO имеет действительно удобный менеджер библиотек, который помогает с настройкой. Вы просто выбираете библиотеку, и она автоматически добавляет ее в выбранный вами проект и проверяет, указаны ли правильные зависимости в файле .ini. Я пытался вручную поместить нужные мне файлы в нужные каталоги и не вносил надлежащих изменений в INI-файл. Спасибо за помощь @Mat!

,