2017-03-08 205 views
-2

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

C:\用户\ VITOR〜1.NUN \应用程序数据\本地\ TEMP \ ccmmwX2d.ltrans0.ltrans.o:在功能setup': ccmmwX2d.ltrans0.o:(.text+0x16a): undefined reference to registrador_nivel” C:\用户\ VITOR〜1.NUN \应用程序数据\本地的\ Temp \ ccmmwX2d.ltrans4.ltrans.o:在功能AutoCampLib::Registrador::debug(char*)': ccmmwX2d.ltrans4.o:(.text+0xae0): undefined reference to registrador_nivel” collect2.exe:错误:LD返回1个退出状态

这是我的lib:

#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 
+2

这意味着没有找到registrador_nivel的编译代码。链接器必须能够找到编译包含'registrador_nivel'代码的文件时产生的目标文件('.o'文件)。你想要更多的解释吗? –

+0

是的请!你需要任何.cpp吗? – Rezik

+0

嗯,我不能确切地告诉你你需要做什么来解决你的问题,因为有*这么多*代码。下次,您应该制作[最小,完整和可验证的示例](http://stackoverflow.com/help/mcve)。但我可以写一个答案来解释为什么你会遇到这种错误。 –

回答

1

链接问题

此错误意味着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. 你确定你编译了所有你应该编译的文件吗?如果你不是,那么你可能会错过.o文件,其中registrador_nivel是,所以你的链接器找不到它。

  3. 如果你正在编译你应该做的所有事情,并且你正在链接所有静态库,那么你可能需要声明registrador_nivel。在这种情况下,请尝试声明一个名为registrador_nivel的全局变量。

+1

非常感谢,@Anthony D.你的解释是一种魅力。解决方案3号似乎是我的情况。非常感谢 – Rezik

+0

@Rezik一切都按预期工作吗?它编译的事实并不意味着它一定有效。 –

+0

是的。它现在正在编译。不幸的是,这个项目需要更大的环境才能得到充分的测试。我测试的进一步是好的,仍然需要修复eleine painel中的一些问题,并且实现了THREADS,之前我从未使用过这个...这是我的下一个挑战哈哈.. @Anthony D. – Rezik