编译器链接器错误?
Compiler Linker error?
我正在为 Arduino 编程,由于当我收到此错误消息时我是初学者,因此我无法解释它以解决它。
">C:\Users\VITOR~1.NUN\AppData\Local\Temp\ccmmwX2d.ltrans0.ltrans.o: In functionsetup':
ccmmwX2d.ltrans0.o:(.text+0x16a): undefined reference to
registrador_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 to
registrador_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
。
典型解决方案
再一次,我无法确切地告诉您必须做什么才能解决问题;我只能猜测。
您是否正在使用静态库(
.lib
或.a
文件)?因为我在你的代码中看到你谈论了Bibliotecas,我想这就是你的问题。也许registrador_nivel
是在库中定义的。在这种情况下,您应该链接到这些库。您正在遵循教程,不是吗?您的教程可能会说明要链接到哪个库以及如何链接。您确定编译了应该编译的所有文件吗?如果不是,则可能缺少
registrador_nivel
所在的.o
文件,因此链接器找不到它。如果你正在编译你应该做的所有东西,并且你正在链接到你应该是的所有静态库,那么也许他们要求你声明
registrador_nivel
。在这种情况下,请尝试声明一个名为registrador_nivel
的全局变量。
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 使用cmake错误链接boost日志
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- 静态库中的 g++ 错误链接函数
- 未定义的参考错误链接天然函数Android
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- QT Q_PROPERTY错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- C 错误链接器命令失败了出口代码1(使用-V查看调用)
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 聚输出错误 - 链接列表
- Xcode链接器错误:链接器命令失败,退出代码为1(使用-v查看调用)
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接