Проблемы uint8_t при связывании библиотек за пределами файла INO

Я пытался начать свой проект с разделения на несколько файлов, зная, что он будет расти. Я создавал шаблон по тому, как я делал файлы C++ в прошлом: классы в отдельном человеке .h/.cpp сопряжение и связь с основным файлом. Я использую библиотеку OneBitDisplay для своих OLED. Когда я включаю библиотеку в свой файл ino и вызываю функции внутри него, все работает нормально. Когда я связываю его с одним из заголовочных файлов моего класса, он выдает следующий вывод:

In file included from C:\Users\Kyle\Documents\Arduino\libraries\OneBitDisplay-master\src/OneBitDisplay.h:4:0,
                 from C:\Users\Kyle\Projects\EOS-OSC\OLED.h:1,
                 from C:\Users\Kyle\Projects\EOS-OSC\OLED.cpp:1:
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:67:1: error: 'uint8_t' does not name a type
 uint8_t iSDA, iSCL; // pin numbers (0xff = disabled)
 ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:68:1: error: 'uint8_t' does not name a type
 uint8_t bWire; // use the Wire library
 ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:69:1: error: 'uint8_t' does not name a type
 uint8_t iSDABit, iSCLBit; // bit numbers of the ports
 ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:70:1: error: 'uint32_t' does not name a type; did you mean 'char32_t'?
 uint32_t iDelay;
 ^~~~~~~~
 char32_t
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:75:10: error: 'uint32_t' does not name a type; did you mean 'char32_t'?
 volatile uint32_t *pSDADDR, *pSDAPORT; // data direction and port register addr
          ^~~~~~~~
          char32_t
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:76:10: error: 'uint32_t' does not name a type; did you mean 'char32_t'?
 volatile uint32_t *pSCLDDR, *pSCLPORT;
          ^~~~~~~~
          char32_t
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:82:26: error: 'uint8_t' has not been declared
 int I2CRead(BBI2C *pI2C, uint8_t iAddr, uint8_t *pData, int iLen);
                          ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:82:41: error: 'uint8_t' has not been declared
 int I2CRead(BBI2C *pI2C, uint8_t iAddr, uint8_t *pData, int iLen);
                                         ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:86:34: error: 'uint8_t' has not been declared
 int I2CReadRegister(BBI2C *pI2C, uint8_t iAddr, uint8_t u8Register, uint8_t *pData, int iLen);
                                  ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:86:49: error: 'uint8_t' has not been declared
 int I2CReadRegister(BBI2C *pI2C, uint8_t iAddr, uint8_t u8Register, uint8_t *pData, int iLen);
                                                 ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:86:69: error: 'uint8_t' has not been declared
 int I2CReadRegister(BBI2C *pI2C, uint8_t iAddr, uint8_t u8Register, uint8_t *pData, int iLen);
                                                                     ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:92:27: error: 'uint8_t' has not been declared
 int I2CWrite(BBI2C *pI2C, uint8_t iAddr, uint8_t *pData, int iLen);
                           ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:92:42: error: 'uint8_t' has not been declared
 int I2CWrite(BBI2C *pI2C, uint8_t iAddr, uint8_t *pData, int iLen);
                                          ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:100:1: error: 'uint8_t' does not name a type
 uint8_t I2CTest(BBI2C *pI2C, uint8_t addr);
 ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:104:27: error: 'uint8_t' has not been declared
 void I2CScan(BBI2C *pI2C, uint8_t *pMap);
                           ^~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:110:27: error: 'uint32_t' has not been declared
 void I2CInit(BBI2C *pI2C, uint32_t iClock);
                           ^~~~~~~~
C:\Users\Kyle\Documents\Arduino\libraries\BitBang_I2C-master\src/BitBang_I2C.h:115:36: error: 'uint8_t' has not been declared
 int I2CDiscoverDevice(BBI2C *pI2C, uint8_t i);
...

Это продолжается довольно долго, когда ссылаются на любые типы из библиотеки stdint. По-видимому, это происходит только тогда, когда библиотека включена в заголовочный файл, а не когда она находится в главном скетче ino. Я связал его в ino, зная, что компилятору нужны все библиотеки, на которые есть ссылки. Когда я удаляю include из заголовка, он выдает ошибки, которые не могут найти типы для переменных, которые я объявил (как и должно быть, учитывая, что эти типы определены в библиотеке, которую я пытаюсь включить).

Есть какие-нибудь зацепки? Я никогда ничего не публиковал на StackOverflow, потому что обычно могу найти ответ, но этот вопрос поставил меня в тупик. Я рад предоставить любой другой код или отладочный вывод, если это необходимо.

, 👍1

Обсуждение

В Oled.cpp (или Oled.h), попробуйте включить Arduino.h перед любым другим включением., @PMF

Вот и все. Спасибо. У меня они были там, просто нужно было иметь Arduino.ч *раньше* всего остального. Имеет смысл, с точки зрения зависимости. Просто немного странно, потому что, глядя на исходный код, библиотеки уже включают Arduino.h себя. Должно быть, это связано с тем, как Arduino ищет зависимости., @Kyle Sunderland


2 ответа


Лучший ответ:

1

Типы uint8_t и uint32_t, указанные в ошибках компиляции, определены в файле stdint.h. In .ino stdint.h входит в комплект поставки Arduino.h (который добавляется в ino для преобразования cpp Arduino builder).

BitBang_I2C.h должен включать Arduino.h или stdint.h, но автор забыл его добавить. Тогда, если BitBang_I2C.h включен в .ino, Arduino.h включен над ним, и типы определены, но если вы включите BitBang_I2C.h в файл cpp, который не включает Arduino.h или stdint.h, то определения stdint отсутствуют.

Обходной путь для этой ошибки состоит в том, чтобы добавить #include <stdint.h> в верхней части вашего OLED.cpp файл.

,

Спасибо. Я включил оба Arduino.h и stdint.h, но, похоже, они у меня вышли из строя. Теперь чувствую себя немного глупо , @Kyle Sunderland


1

Arduino IDE неявно включает в себя некоторые заголовки. Особенно "arduino.h".
Для полноты картины вам необходимо включить "stdint.h" в заголовочные файлы.

,