Проблемы 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, потому что обычно могу найти ответ, но этот вопрос поставил меня в тупик. Я рад предоставить любой другой код или отладочный вывод, если это необходимо.
@Kyle Sunderland, 👍1
Обсуждение2 ответа
Лучший ответ:
Типы 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
Arduino IDE неявно включает в себя некоторые заголовки. Особенно "arduino.h".
Для полноты картины вам необходимо включить "stdint.h" в заголовочные файлы.
- C++ против языка Arduino?
- ошибка: ожидаемое первичное выражение перед токеном ','
- Ввести идентификатор чипа ESP32 в строковую переменную (новичок в Arduino/C++)
- Передача функции-члена класса в качестве аргумента
- Улучшенное циклическое переключение цветов RGB.
- Какие есть другие IDE для Arduino?
- Несовместимые типы при назначении «uint8_t {aka unsigned char}» на «uint8_t [1] {aka unsigned char [1]}»
- Как преобразовать массив символов в строку в arduino?
В Oled.cpp (или Oled.h), попробуйте включить Arduino.h перед любым другим включением., @PMF
Вот и все. Спасибо. У меня они были там, просто нужно было иметь Arduino.ч *раньше* всего остального. Имеет смысл, с точки зрения зависимости. Просто немного странно, потому что, глядя на исходный код, библиотеки уже включают Arduino.h себя. Должно быть, это связано с тем, как Arduino ищет зависимости., @Kyle Sunderland