PlatformIO: collect2.exe: ошибка: ld returned 1 exit status

Я пробую некоторые файлы библиотеки для esp8266. Я создал файлы hpp и .cpp. Но я пытаюсь скомпилировать программу, я получил эту ошибку на VSCode. collect2.exe: ошибка: ld вернул 1 статус выхода *** [.pio\build\huzzah\firmware.elf] Ошибка 1 Я поместил файлы в папку src, но все равно получил это. Какие моменты я пропустил?

Building in release mode
Linking .pio\build\huzzah\firmware.elf
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::Neotimer()':
main.cpp:(.text._ZN8NeotimerC2Ev+0x0): multiple definition of `Neotimer::Neotimer()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8NeotimerC2Ev+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::Neotimer()':
main.cpp:(.text._ZN8NeotimerC2Ev+0x0): multiple definition of `Neotimer::Neotimer()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8NeotimerC2Ev+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::Neotimer(unsigned long)':
main.cpp:(.text._ZN8NeotimerC2Em+0x0): multiple definition of `Neotimer::Neotimer(unsigned long)'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8NeotimerC2Em+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::Neotimer(unsigned long)':
main.cpp:(.text._ZN8NeotimerC2Em+0x0): multiple definition of `Neotimer::Neotimer(unsigned long)'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8NeotimerC2Em+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::~Neotimer()':
main.cpp:(.text._ZN8NeotimerD2Ev+0x0): multiple definition of `Neotimer::~Neotimer()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8NeotimerD2Ev+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::~Neotimer()':
main.cpp:(.text._ZN8NeotimerD2Ev+0x0): multiple definition of `Neotimer::~Neotimer()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8NeotimerD2Ev+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::init()':
main.cpp:(.text._ZN8Neotimer4initEv+0x0): multiple definition of `Neotimer::init()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer4initEv+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::repeatReset()':
main.cpp:(.text._ZN8Neotimer11repeatResetEv+0x0): multiple definition of `Neotimer::repeatReset()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer11repeatResetEv+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::done()':
main.cpp:(.text._ZN8Neotimer4doneEv+0x4): multiple definition of `Neotimer::done()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer4doneEv+0x4): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::set(unsigned long)':
main.cpp:(.text._ZN8Neotimer3setEm+0x0): multiple definition of `Neotimer::set(unsigned long)'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer3setEm+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::get()':
main.cpp:(.text._ZN8Neotimer3getEv+0x0): multiple definition of `Neotimer::get()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer3getEv+0x0): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::stop()':
main.cpp:(.text._ZN8Neotimer4stopEv+0x4): multiple definition of `Neotimer::stop()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer4stopEv+0x4): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::reset()':
main.cpp:(.text._ZN8Neotimer5resetEv+0x8): multiple definition of `Neotimer::reset()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer5resetEv+0x8): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::repeat()':
main.cpp:(.text._ZN8Neotimer6repeatEv+0xc): multiple definition of `Neotimer::repeat()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer6repeatEv+0xc): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::repeat(int)':
main.cpp:(.text._ZN8Neotimer6repeatEi+0x8): multiple definition of `Neotimer::repeat(int)'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer6repeatEi+0x8): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::repeat(int, unsigned long)':
main.cpp:(.text._ZN8Neotimer6repeatEim+0x4): multiple definition of `Neotimer::repeat(int, unsigned long)'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer6repeatEim+0x4): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::start()':
main.cpp:(.text._ZN8Neotimer5startEv+0x4): multiple definition of `Neotimer::start()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer5startEv+0x4): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::debounce(bool)':
main.cpp:(.text._ZN8Neotimer8debounceEb+0x8): multiple definition of `Neotimer::debounce(bool)'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer8debounceEb+0x8): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::restart()':
main.cpp:(.text._ZN8Neotimer7restartEv+0x4): multiple definition of `Neotimer::restart()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer7restartEv+0x4): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::waiting()':
main.cpp:(.text._ZN8Neotimer7waitingEv+0x4): multiple definition of `Neotimer::waiting()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer7waitingEv+0x4): first defined here
c:/users/dogan/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: .pio\build\huzzah\src\main.cpp.o: in function `Neotimer::started()':
main.cpp:(.text._ZN8Neotimer7startedEv+0x0): multiple definition of `Neotimer::started()'; .pio\build\huzzah\src\communication.cpp.o:communication.cpp:(.text._ZN8Neotimer7startedEv+0x0): first defined here

Извините, я новичок в сообществе stackexchange, поэтому могу делать основные ошибки в использовании.

Теперь я добавляю файлы main.cpp, Communication.cpp и Communication.h. Как я уже говорил, я не включил неотимер и удалил. Раньше я добавлял эту библиотеку в свой проект, интерфейс библиотеки PIO. Я думаю, что эта проблема исходит из этого. Большое спасибо за вашего пациента и советы.

связь.cpp:

#include "communication.h"
#include "database.h"
#include "management.h"
#include "wifi.h"


String GetCommand(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++)
   {
    if (data.charAt(i) == separator || i == maxIndex) 
    {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }
  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void checkStream(WiFiServer tcpServer,WiFiClient tcpClient, Neotimer timer,boolean pulseCheck)
{


 // WiFi-клиент _tcpClient;
  tcpClient.setTimeout(200);
  tcpClient  = tcpServer.available();

  if(tcpClient && tcpClient.connected())
  {
    Serial.println("Timer Off");
    timer.stop();
    String requestStr = tcpClient.readStringUntil('\r');
      if(requestStr.length()>=8)
      {
        tcpClient.print(ParseStream(requestStr));
        pulseCheck = false;
        delay(3000);
         String requestSplitStr = GetCommand(requestStr, ' ', 0);
         if(requestSplitStr == "ayg_set_modem_info")
         {
          Serial.println("Device is going to sleep now!");
          Sleep();
         }
      }  
  }
  else
  { 
    return;
  }
}

String ParseStream(String content)
{
  String requestSplitStr = GetCommand(content, ' ', 0);
  if(requestSplitStr == "ayg_set_modem_info")
  {
    String ssid = GetCommand(content, ' ', 1);
    String pass = GetCommand(content, ' ', 2); 
    Serial.println("SSID,PASS TAKING");
    delay(200); 
    ClearEP();
    boolean resSsid = WriteEPSsid(ssid);
    boolean resPass = WriteEPPass(pass);
    Aprint("SSID: "+ReadEPSsid());
    Aprint("Pass: "+ReadEPPass()); 
    //_tcpClient.flush();
    if(resPass)
    {
      if(STATest())
      {
        return JsonResult("true");

      }
      else
      {
        return JsonResult("false");
      }

    }
    else
    {
      return JsonResult("false");
    }

  }

  else if(requestSplitStr == "ayg_get_vbatt")
  {
    return JsonResult(GetBattery());
   // _tcpClient.flush();
   // _tcpClient.stop();
  }

связь.h

#ifndef communication_h
#define communication_h
#if ARDUINO > 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <WiFiServer.h>
#include <WiFiClient.h>
#include <neotimer.h>
#include "ArduinoJson.h"

//ПЕРЕМЕННЫЕ


    String GetCommand(String data, char seperator, int index);
    String ParseStream(String content);
    void checkStream(WiFiServer tcpServer,WiFiClient tcpClient, Neotimer timer,boolean pulseCheck);
    String JsonResult(String result);


#endif

main.cpp:

#include <stdlib.h>
#include <HX711.h>
#include <Arduino.h>
#include <ESP8266WebServer.h>

#include <string.h>
#include "communication.h"
#include <management.h>
#include <wifi.h>
#include <database.h>






#define DOUT 13 // D7
#define SCK 15 // D8
#define led1 5 // D1-Цвет?
#define led2 4 // D2-цвет?
#define led3 0 // D3-цвет?
#define led4 2 // Цвет D4?
#define led5 14 // D5 Color_?
#define button 12 //Кнопка-D5
#define VERSION "1.0"
#define CALIBRATIONWEIGHT 5.0
#define LPG  12.2

struct rst_info *rtc_info = system_get_rst_info();
ADC_MODE(ADC_VCC);
WiFiServer _tcpServer(41400);
WiFiClient _tcpClient;
// HTTP-клиент http;
HX711 scale;


/*Scale Values*/
float tareValFromclient;
float calibration_factor = 26845.0;
float grossWeight;
char sGrossWeight[10];
int ledPercentage;
/*Sleep Values*/
bool sleepPulseCheck=false;


/*Timers and Intervals*/
/*const unsigned long sleepInterval = 200000; // Секунды до сна
const unsigned long scaleInterval = 2000; // Интервал масштабирования бака
const unsigned long ledInterval = 200;
Neotimer sleepTimer(sleepInterval);
Neotimer scaleTimer(scaleInterval);
Neotimer ledTimer(ledInterval);*/

#pragma region PROTOYPES
/*PROTOTYPES*/
void Initialize();
String checkTankTare();
void powerUpScale();
void powerDownScale();
bool Tare();
void getGrossWeight(float *fGross, char*sGross);
String getDeviceTare();
float calculateFirstNetWeight();
float getNetWeight();
int calculatePercentage();
void ledDrivePercentage(int percentage);
String calibrateScale();
#pragma endregion

/*---------------------------------------*/

void setup() {
  ESP.eraseConfig();
  Initialize();
  Serial.println("started");
}

void loop() {
  //Serial.printf("подключено:%d\n", WiFi.softAPgetStationNum()); // bağlı клиент sayısı
 calibrateScale();
// checkStream(_tcpServer,_tcpClient,/*sleepTimer*/sleepPulseCheck);
 ledDrivePercentage(calculatePercentage());
 WriteEPGross(sGrossWeight);




 if(sleepPulseCheck == false)
 {
   sleepPulseCheck = true;
  // Таймер сна.start();
   Serial.println("Sleep Fired");


 }
}

, 👍0

Обсуждение

библиотека neotimer неверна. он не может быть включен более чем в один файл, @Juraj

Я удалил все включения и включил только в Communication.cpp, но все еще получаю эту ошибку, @Dogan Cignakli

половина вашего предыдущего комментария не может быть правдой, @Juraj

Я сделал это, но все равно, @Dogan Cignakli

Мы не можем сказать вам больше, потому что вы не дали нам достаточно информации. Juraj точно написал, что говорит нам вывод компиляции, который вы разместили: библиотека neotimer была определена несколько раз. Вы должны показать нам свой код и ссылку на используемые библиотеки. Затем мы можем проверить в вашем коде, где проблема (лечение болезни вместо того, чтобы пытаться вылечить симптом)., @chrisl

вы включаете связь.cpp? обычно вы включаете файл .h, а не файл .cpp (хотя, конечно, вы можете включить все, что вам нравится, расширение на самом деле не имеет значения) - попробуйте добавить #pragma Once в начало файла, который вы включая, @Jaromanda X

Я добавил свои коды в первое упоминание. Извините, я новичок в этом сообществе и могу делать некоторые основные ошибки. Спасибо за советы., @Dogan Cignakli


1 ответ


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

1

Проблема связана с тем, что автор "библиотеки" Neotimer определил методы в заголовочном файле, см. neotimer.h.

Если вы включите этот заголовок более чем в 1 источник вашего проекта, вы получите эти ошибки "несколько определений".

Для решения этой проблемы у вас есть (как минимум) следующие варианты:

  1. Сделайте Neotimer правильной библиотекой с отдельными заголовочными и исходными файлами. Скомпилируйте исходный код в файл библиотеки. Поскольку у меня нет опыта работы с Arduino, я не знаю, как это делают другие библиотеки.
    • Недостаток: вы возитесь со сторонним кодом. Обычно это обескураживает. Вам придется поддерживать свою копию библиотеки самостоятельно, что сводит на нет некоторые преимущества использования библиотек.
  2. Не включайте neotimer.h в свой файл header, включайте его только в один из ваших исходных файлов. Если вам нужно какое-то объявление типа Neotimer в других модулях, добавьте предварительное объявление, но не включайте его заголовочный файл.
  3. Используйте другую библиотеку, которая лучше реализована.

Вы можете сказать, что включили neotimer.h только в один модуль. Это неверно. Вы включили его в свой собственный заголовочный файл communication.h, который вы включили в оба исходных файла. Таким образом, он проникает в оба модуля. Вы ничего не можете с этим поделать с помощью «магии» препроцессора, потому что оба модуля компилируются независимо друг от друга.


Это объявление класса Neotimer по состоянию на 12 января 2020 г., 18:40 UTC. Используйте столько, сколько вам нужно от него, как предварительную декларацию. Вы даже можете поместить это в приличный заголовочный файл.

class Neotimer{
    public:
    //Методы
    Neotimer();
    Neotimer(unsigned long _t);      //Конструктор
    ~Neotimer();            // Деструктор

    void init();            //Инициализации
    boolean done();         //указывает на то, что время истекло
    boolean repeat(int times);
    boolean repeat(int times, unsigned long _t);
    boolean repeat();
    void repeatReset();
    boolean waiting();          // Указывает, что таймер запущен, но не завершен
    boolean started();          // Указывает, что таймер запущен
    void start();           // Запускает таймер
    unsigned long stop();           // Останавливает таймер и возвращает прошедшее время
    void restart();
    void reset();           //Сбрасывает таймер на ноль
    void set(unsigned long t);
    unsigned long get();
    boolean debounce(boolean signal);
    int repetitions = NEOTIMER_UNLIMITED;

    private:

    struct myTimer{
        unsigned long time;
        unsigned long last;
        boolean done;
        boolean started;
    };

    struct myTimer _timer;
    boolean _waiting;
};
,

Можете ли вы объяснить предварительную декларацию? Как мне это сделать? Я искал в Интернете, и это похоже на прототипирование функции., @Dogan Cignakli

Что ж, у меня возникает соблазн отослать вас обратно к вашей книге по C++. ;-) Но мое редактирование может вам помочь., @the busybee

Спасибо за большую помощь. Я новичок в C++ и встроенных системах. Я пытаюсь глубоко погрузиться и попробовать написать модульные коды. Но я получил ваш темп и проверю правила С++ :), @Dogan Cignakli