2016-01-24 3 views
-1

У меня возникла проблема с составлением эскиза arduino.Ошибка компилятора Arduino IDE множественное определение

я получаю эти ошибки:

C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp/bit_array.cpp:6: multiple definition of `Bit_Array::Bit_Array(unsigned long)' 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp\bit_array.cpp.o:C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp/bit_array.cpp:6: first defined here 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp\Master_Controller_modbus_RTU.cpp.o: In function `Bit_Array::~Bit_Array()': 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp/bit_array.cpp:18: multiple definition of `Bit_Array::~Bit_Array()' 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp\bit_array.cpp.o:C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp/bit_array.cpp:18: first defined here 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp\Master_Controller_modbus_RTU.cpp.o: In function `Bit_Array::~Bit_Array()': 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp/bit_array.cpp:18: multiple definition of `Bit_Array::~Bit_Array()' 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp\bit_array.cpp.o:C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp/bit_array.cpp:18: first defined here 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp\Master_Controller_modbus_RTU.cpp.o: In function `Bit_Array::Set_Value_MSB(unsigned char, unsigned long, unsigned char)': 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp/bit_array.cpp:26: multiple definition of `Bit_Array::Set_Value_MSB(unsigned char, unsigned long, unsigned char)' 
C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp\bit_array.cpp.o:C:\Users\FRANCE~1\AppData\Local\Temp\build8652217817452966608.tmp/bit_array.cpp:26: first defined here 
collect2.exe: error: ld returned 1 exit status 
Errore durante la compilazione 

Это означает, что я определил более чем один раз, мой конструктор, деструктор и методы. Я немного смущен, потому что я определил его только один раз, как вы можете видеть.

bit_array.h

#ifndef bit_array 
#define bit_array 

// includo il supporto per le funzioni base dell'arduino 
#if defined(ARDUINO) && ARDUINO >= 100 
    #include "Arduino.h" 
#else 
    #include "WProgram.h" 
    #include <pins_arduino.h> 
#endif 


#include<cstdint> // libreria per supporto tipo uint8_t in C++ standard (arduino lo conosce, ma voglio fare la libreria cross-plattform) 

class Bit_Array 
    { 
    private: 
     unsigned long N_Elementi;     // Numero di bit della memoria effettivamente utilizzati (es 15 bit occupano 2byte, ma solo i primi 15bit hanno significato). 
     uint8_t* Array;       // array di uint8_t. Ogni uint8_t verrà interpretato come una sequenza di 8 bool 
     unsigned long Dimensione;     // Dimensione (in byte) della memoria puntata da Array. Deve essere allocata una quantità di memoria pari a upper_bound(N_elementi/8) 

    public: 
     Bit_Array(const unsigned long Number_of_Elements); 
     ~Bit_Array(); 

     // Getters 
     uint8_t Get_Value_MSB(const unsigned long Inizio, const uint8_t Lunghezza) const; 
     uint8_t Get_Value_LSB(const unsigned long Inizio, const uint8_t Lunghezza) const;   // Implementazione futura 

     // Setters 
     void Set_Value_MSB(const uint8_t B, const unsigned long Inizio, const uint8_t Lunghezza); 
     void Set_Value_LSB(const uint8_t B, const unsigned long Inizio, const uint8_t Lunghezza); // Implementazione futura 
     void Print() const; 
    }; 

#endif 

bit_array.cpp

#include "bit_array.h" 

Bit_Array::Bit_Array(const unsigned long Number_of_Elements) 
    { 
     if(Number_of_Elements <= 0) 
      {Array=NULL;}  // non alloco la memoria 
     else 
      { 
      N_Elementi = Number_of_Elements; 
      Dimensione = (unsigned long) (((double)Number_of_Elements/8.0) + 0.5); // alloco una quantità di memoria sufficiente a memoriazzare i Number_of_Elements. La memoria viene allocata con granularità di byte, quindi devo allocare Number_of_Elements/8 byte e poi arrotondare per eccesso 

      } 
    } 

Bit_Array::~Bit_Array() 
    {if(Array!=NULL) 
     {delete Array; 
     Array=NULL;} 
    } 


void Bit_Array::Set_Value_MSB(const uint8_t B, const unsigned long Inizio, const uint8_t Lunghezza) 
    { 

    } 

В главной я только

#include "bit_array.cpp" 

То же самое тонкое g происходит со всеми другими моими методами.

С помощью DevC++ IDE я могу скомпилировать код, поэтому я думаю, что проблема связана с Arduino IDE.

Большое спасибо вам помочь, я желаю вам приятного дня

+2

_' # include "bit_array.cpp" '_ Не включайте исходные файлы, это вопиюще неправильно! Включите заголовки для получения деклараций и соедините все файлы '.cpp', содержащие определения. –

+0

# πάντα ῥεῖ Благодарим вас за ответ. Как вы мне предлагаете, В основном я теперь включил .h вместо .cpp, и он работает! У меня вопрос ... с 3 лет я всегда включаю .cpp в main, и он всегда работает (с использованием gcc-компилятора). Я узнал об этом в университете. Я действительно не понимаю вашего «вопиющего неправильного» ... Я думаю, что я могу скомпилировать все cpp самостоятельно, а не связывать файлы .o или включать весь код в main и компилировать его (это похоже на копирование всего кода в один файл и скомпилируйте его). Если это неправильно, я снова изучу процесс компиляции и компоновки. спасибо !! – user3450036

ответ

1

Я бы посоветовал вам взглянуть на this article, для лучшего понимания include директивы.

C++ programs are built in a two stage process. First, each source file is compiled on its own. The compiler generates intermediate files for each compiled source file. These intermediate files are often called object files -- but they are not to be confused with objects in your code. Once all the files have been individually compiled, it then links all the object files together, which generates the final binary (the program).

Even though MyClass is declared in your program, it is not declared in main.cpp, and therefore when you compile main.cpp you get that error.

This is where header files come in. Header files allow you to make the interface visible to other .cpp files

Так что вам нужно включить заголовочный файл, а не источник. Надеюсь это поможет.

Смежные вопросы