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");
}
}
@Dogan Cignakli, 👍0
Обсуждение1 ответ
Лучший ответ:
Проблема связана с тем, что автор "библиотеки" Neotimer определил методы в заголовочном файле, см. neotimer.h.
Если вы включите этот заголовок более чем в 1 источник вашего проекта, вы получите эти ошибки "несколько определений".
Для решения этой проблемы у вас есть (как минимум) следующие варианты:
- Сделайте Neotimer правильной библиотекой с отдельными заголовочными и исходными файлами. Скомпилируйте исходный код в файл библиотеки. Поскольку у меня нет опыта работы с Arduino, я не знаю, как это делают другие библиотеки.
- Недостаток: вы возитесь со сторонним кодом. Обычно это обескураживает. Вам придется поддерживать свою копию библиотеки самостоятельно, что сводит на нет некоторые преимущества использования библиотек.
- Не включайте
neotimer.h
в свой файл header, включайте его только в один из ваших исходных файлов. Если вам нужно какое-то объявление типаNeotimer
в других модулях, добавьте предварительное объявление, но не включайте его заголовочный файл. - Используйте другую библиотеку, которая лучше реализована.
Вы можете сказать, что включили 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
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ESP8266 не подключается к Wi-Fi
- AT-команда не отвечает на последовательный монитор
- Разница между этими двумя платами NodeMCU?
библиотека neotimer неверна. он не может быть включен более чем в один файл, @Juraj
Я удалил все включения и включил только в Communication.cpp, но все еще получаю эту ошибку, @Dogan Cignakli
половина вашего предыдущего комментария не может быть правдой, @Juraj
Я сделал это, но все равно, @Dogan Cignakli
Мы не можем сказать вам больше, потому что вы не дали нам достаточно информации. Juraj точно написал, что говорит нам вывод компиляции, который вы разместили: библиотека neotimer была определена несколько раз. Вы должны показать нам свой код и ссылку на используемые библиотеки. Затем мы можем проверить в вашем коде, где проблема (лечение болезни вместо того, чтобы пытаться вылечить симптом)., @chrisl
вы включаете
связь.cpp
? обычно вы включаете файл.h
, а не файл.cpp
(хотя, конечно, вы можете включить все, что вам нравится, расширение на самом деле не имеет значения) - попробуйте добавить#pragma Once
в начало файла, который вы включая, @Jaromanda XЯ добавил свои коды в первое упоминание. Извините, я новичок в этом сообществе и могу делать некоторые основные ошибки. Спасибо за советы., @Dogan Cignakli