编译器链接器错误?

Compiler Linker error?

本文关键字:错误 链接 编译器      更新时间:2023-10-16

我正在为 Arduino 编程,由于当我收到此错误消息时我是初学者,因此我无法解释它以解决它。

">C:\Users\VITOR~1.NUN\AppData\Local\Temp\ccmmwX2d.ltrans0.ltrans.o: In functionsetup': ccmmwX2d.ltrans0.o:(.text+0x16a): undefined reference toregistrador_nivel' C:\Users\VITOR~1.NUN\AppData\Local\Temp\ccmmwX2d.ltrans4.ltrans.o: In functionAutoCampLib::Registrador::debug(char*)': ccmmwX2d.ltrans4.o:(.text+0xae0): undefined reference toregistrador_nivel' collect2.exe:错误:ld 返回 1 个退出状态">

这是我的库:

#ifndef LIBAC_H
#define LIBAC_H
#define DEBUG
/***************************************************/
/********************Bibliotecas********************/
/***************************************************/
/*           Biblioteca padrão do Arduino          */
#include <Arduino.h>
/* Bibliotecas de data/hora para módulo DS1307 RTC */
#include <Wire.h>
#include <RTClib.h>
#include <Time.h>
#include <TimeLib.h>
#include <TimeAlarms.h>

/* Bibliotecas de leitura e escrita para módulo SD */
#include <SD.h>
#include <SPI.h>
/*    Biblioteca do módulo ultrassônico HC-SR04    */
#include <Ultrasonic.h>
/*    Biblioteca de Lista Encadeada    */
#include <LinkedList.h>
/*    Biblioteca de Threads    */
#include "Thread.h"
#include "ThreadController.h"
/*    Biblioteca de HashMap    */
#include <HashMap.h>
/***************************************************/
/******************Mapa da Pinagem******************/
/***************************************************/
#define PINO_SD_CS 53
#define setor_1   23
#define setor_2   25
#define setor_3   42
#define setor_4   43
#define setor_5   44
#define setor_6   45
#define setor_7   12
#define setor_8   13
#define setor_9   22
#define setor_10  24
#define setor_11  26
#define setor_12  28
#define setor_13  30
#define setor_14  32
#define setor_15  34
#define DesligaBombaCaptacao 31
#define LigaBombaCaptacao 33
#define DesligaBombaInjec   35
#define LigaBombaInjec  37
#define valvulaDescarte 46
#define DesligaPaMistura    39
#define LigaPaMistura   41
#define silo_1  10
#define silo_2  11
#define valvulaL2   29
#define contraLavagem 27
#define segundosUmaSemana 604800
#define TEMPO_OCIOSO 300
#define pinoInterruptTanque 0   // corresponde ao pino 2
#define pinoInterruptSilo 1     // corresponde ao pino 3
#define pinoInterruptInjec 2    // corresponde ao pino 4
#define pinoSensorTanque    6
#define pinoSensorSilo  5
#define pinoSensorInjec 8    
#define boiaInferior 7
#define boiaSuperior 9 
#define VOLUME_PURGA 100  // em Litros

#define ULTIMA_MENSAGEM "Ultima.msg"
#define SILOS_PRODUTOS "Silos.cfg"
#define PROGRAMACAO "Ferti.cal"
#define CONFIGURACAO "Start.cfg"
#define RETROLAVAGEM "Retrolavagem.cal"
#define DADOS "AutoCamp.nfo"
#define LOG "AutoCamp.log"
#define BACKUP "Backup.log"
namespace AutoCampLib {
class Mensageiro
{
public:
Mensageiro();
void lerSerial();
void enviar1099();
private:
bool guardarMensagem(char mensagem[]);
bool tratarMensagem();
void tratar2001();
void tratar2002();
void tratar2003();
void tratar2101();
void tratar2901();
void tratar2902();
void tratar2903();
void tratar2904();
void tratar2905();
void tratar2999();
void enviar1001();
void enviar1002();
void enviar1003();
void enviar1004();
void enviar1005();
void lerArquivo(String nome);
void escreverArquivo(String nome, int identificacao);
bool verificaLetra(char caracter);
};
class Registrador
{
public:
static void debug(char mensagem[]);
static void info(char mensagem[]);
static void warn(char mensagem[]);
static void error(char mensagem[]);
private:
static void escreverRegistro(char mensagem[],char tipo[]);
static void verificarTamanho();
static String buscarDataHora();
};
class Fertilizantes
{
public :
void setSilo(char *s);
void setVol(float volumeFert);
char *getSilo();
float getVol();
void setPortaSilo(int portasilo);
int getPortaSilo();

private :
char _silo[8];
float volumeF;
int _portasilo;
};
class Eventos
{
public :
Eventos();
void setSetor(int setor);
void setDuracao(int duracao);
void setSequencial(int sequencial);
void setVolumeH2O(float volumeAgua);
void setPorta(int porta);
int getPorta();
int getSetor();
int getDuracao();
int getSequencial();
float getVolumeH2O();
//void setFertilizantes(LinkedList<Fertilizantes*>);
//LinkedList<Fertilizantes*> getFertilizantes();
Fertilizantes* getFertilizante(int posicao);
void addFertilizante(Fertilizantes* fertilizante);
int sizeFertilizantes();

private :
int _setor;
int _porta;
float _duracao;
int _sequencial;
float _volumeH2O;
LinkedList<Fertilizantes*> _fertilizantes;
};
class Agendamentos
{
public:
Agendamentos();
void setDia(int dia);
void setHora(int hora);
void setMinuto(int minuto);
void setSegundo(int segundo);
int getDia();
int getHora();
int getMinuto();
int getSegundo();
//LinkedList<Eventos*> getEventos();
Eventos* getEvento(int posicao);
void addEvento(Eventos* evento);
int sizeEventos();
private :
int _dia;
int _hora;
int _minuto;
int _segundo;
int posicao;
LinkedList<Eventos*> _eventos;
};
class Start 
{
public :
void setPressurizacao (int pressurizacao);
void setTroca (int troca);
void setInjecao(int injecao);
void setAtraso( int atraso);
void setOrdem(int ordem);
void setBase(float base);
void setTopo(float topo);
void setAltura(float altura);
void setSiloSTART(char *p);
void setPino(int pino);
void openReadStart(Start *start);
void leCaracter(char c, File file);
int getPressurizacao();
int getTroca();
int getInjecao();
int getAtraso();
int getOrdem();
float getBase();
float getTopo();
float getAltura();
char *getSiloSTART();
int getPino();
private :
Start *start;
File startcfg;
int pr;
int troca;
int inj;
int atraso;
int seq;
int pino;
float base;
float topo;
float altura;
char charLido;
int _pressurizacao;
int _troca;
int _injecao;
int _atraso;
int _ordem;
float _base;
float _topo;
float _altura;
char _silostart[8];
int _pino;
};

class Util 
{
public :
static double calculaVolume(byte sensorInterrupt,byte sensorPin, float volumeDesejado);
static void contadorPulso();
}; 

class SensorNivel: public Thread 
{
public : bool shouldRun(long time);
void run();
private : int estado;    
};

class Programas: public Thread
{
public :   bool shouldRun(long time);
void run();
private :  unsigned long tempo;
DateTime now ;
};
class RecuperaIrriga: public Thread
{
public : 
bool shouldRun(long time);
void run(); 
void fecharTodoSetor();
void verificarSetores(int numSetor);
private : long horaFim;
long horaAtual;
long horaAgendamento;
int numeroEvento;
DateTime now;
Agendamentos *agendamento;
}; 

class VolumeAgua: public Thread
{
public :
bool shouldRun(long time);
void run();
static void contadorPulso();
double calculaVolume(byte sensorInterrupt,byte sensorPin, float volumeDesejado);
private : volatile byte contaPulso; 
int numeroFert;
int numeroEvento;
float taxaFluxo;
float fatorCalibrador;
unsigned int fluxoL;
unsigned long totalL;
unsigned long oldTime;
};
class VolumeSilo: public Thread
{
public :
bool shouldRun(long time);
void run();
static void contadorPulso();
double calculaVolume(byte sensorInterrupt,byte sensorPin, float volumeDesejado);
private :   float fatorCalibrador;
volatile byte contaPulso;
int numeroEvento;
int numeroFert;    
float taxaFluxo;
unsigned int fluxoL;
unsigned long totalL;
unsigned long oldTime;      
};

class RecuperaFerti: public Thread
{
public : 
void verificarSetores(int numSetor);
void run();
bool shouldRun(long time);

private : long horaAtual;
long inicio;
int encherTanque;
long horaAgendamento;
int encherSilo;
int numeroFert;
int numeroEvento;
DateTime now;
Agendamentos *agendamento;

}; 
class RecuperaSilos: public Thread
{
public :   bool shouldRun(long time);
void run(); 
private :  int numeroFert;
int numeroEvento; 
}; 
class Injecao: public Thread 
{
public : bool shouldRun(long time);
void run();   

private : int numeroFert;
int numeroEvento;
int estado;
};                   
class NivelInjec: public Thread
{
private : int estado;
public : bool shouldRun(long time);
void run();   
};
class Purga: public Thread
{
public :  void run();
bool shouldRun(long time);
static void contadorPulso();
double calculaVolume(byte sensorInterrupt,byte sensorPin, float volumeDesejado);      
};

class NivelPurga: public Thread
{
private : int estado;
DateTime now;
int numeroEvento;
long horaAtual;
long horaAgendamento;
Agendamentos *agendamento;
public : bool shouldRun(long time);
void run();
fecharTodoSetor();   
};


}
using namespace AutoCampLib;
#endif

链接器问题

此错误意味着registrador_nivel应该存在于某处,但链接器找不到位置。我无法确切地说出您的问题是什么,因为您有太多代码

让我向您展示一个示例,该示例将产生您刚刚得到的错误。假设我只有这个文件:

// main.cpp
extern char registrador_nivel;
int main() {
registrador_nivel = 2;
}

extern char registrador_nivel;行告诉您的编译器,在某个地方,您有一个名为registrador_nivel的全局变量。但是,main.cpp没有指定registrador_nivel在哪里。它只是说registrador_nivel存在于某个地方。

registrador_nivel = 2;行尝试更改registrador_nivel的值。你仍然不知道registrador_nivel在哪里。你只知道你必须改变它。

目标文件(main.o文件)将在编译过程中生成。它是一个包含与main.cpp,但它是一种计算机更容易理解的格式。所以main.o仍然没有说registrador_nivel在哪里。

现在,您希望从main.o文件制作最终可执行文件。链接器尝试查找registrador_nivel实际位置。为此,它会查看静态库(.lib.a文件)以及其他目标文件(.o文件)。如果没有库或对象文件说明registrador_nivel在哪里,则链接器将发送错误undefined reference to registrador_nivel


典型解决方案

再一次,我无法确切地告诉您必须做什么才能解决问题;我只能猜测。

  1. 您是否正在使用静态库(.lib.a文件)?因为我在你的代码中看到你谈论了Bibliotecas,我想这就是你的问题。也许registrador_nivel是在库中定义的。在这种情况下,您应该链接到这些库。您正在遵循教程,不是吗?您的教程可能会说明要链接到哪个库以及如何链接。

  2. 您确定编译了应该编译的所有文件吗?如果不是,则可能缺少registrador_nivel所在的.o文件,因此链接器找不到它。

  3. 如果你正在编译你应该做的所有东西,并且你正在链接到你应该是的所有静态库,那么也许他们要求你声明registrador_nivel。在这种情况下,请尝试声明一个名为registrador_nivel的全局变量。

相关文章: