c++ — Двойное подключение h файла
Вопрос задан
Изменён 1 год 8 месяцев назад
Просмотрен 191 раз
Есть сторонняя библиотека IRRemote для Arduino с таким заголовочным файлом IRremote.h
#ifndef IRremote_h #define IRremote_h ......... #include "IRremoteInt.h" /* * Include the sources here to enable compilation with macro values set by user program. */ #include "irReceive.cpp.h" #include "irSend.cpp.h" #include "IRremote.cpp.h" #endif // IRremote_h #pragma once
В irReceive.cpp.h
есть такой код
IRrecv IrReceiver; IRrecv::IRrecv() { irparams.recvpin = 0; // 44 строка irparams.blinkflag = false; }
Теперь использование.
В своем main.
пишу
#include <IRremote.h> #include "Controller.h" ......
Все компилируется без ошибок. Но если я в Controller.h
тоже добавлю инклуд
#ifndef CONTROLLER_H #define CONTROLLER_H #include <IRremote.h> #include "Settings.h" class Controller { ..... } #endif //CONTROLLER_H
То получаю каскад ошибок линковки
CMakeFiles\Controller.dir\src\main.cpp.obj: In function
cpp.obj:C:\PROGRA~2\Arduino\LIBRAR~1\IRremote\src/irReceive.cpp.h:44: first defined hereIRrecv::IRrecv()
:
C:\PROGRA~2\Arduino\LIBRAR~1\IRremote\src/irReceive.cpp.h:44: multiple definition ofIRrecv::IRrecv()
CMakeFiles\Controller.dir\src\Controller.cpp.obj:C:\PROGRA~2\Arduino\LIBRAR~1\IRremote\src/irReceive.cpp.h:44: first defined here
………
CMakeFiles\Controller.dir\src\controller.cpp.obj: In functionIRrecv::IRrecv()
:
C:\PROGRA~2\Arduino\LIBRAR~1\IRremote\src/irReceive.cpp.h:44: multiple definition ofIRrecv::decode()
CMakeFiles\Controller.dir\src\AirConditionController.
Ошибок очень много, но все они ссылаются на одно место irReceive.cpp.h:44
Controller.h
также инклудится в файл Controller.cpp
, где находится реализация класса Controller
Как с этим бороться и откуда возникает эта ошибка? Ведь IRremote.h
содержит include guard. Да, include guard не содержит файл irReceive.cpp.h
, но он инклудится в одном месте в IRremote.h
- c++
- c
- arduino
- include
- стандарт
7
Вот этот код, о котором вы пишете —
IRrecv IrReceiver; IRrecv::IRrecv() { irparams.recvpin = 0; // 44 строка irparams.blinkflag = false; }
оказавшись дважды в разных .cpp-файлах, приводит к появлению объекта IrReceiver
и конструктора в двух файлах. Линковщик не знает, какой выбрать.
Если у вас С++ не очень старый — вас спасет просто добавление слова inline
перед каждым из них.
Если старый — то лучше не заморачиваться, а перенести это все в отдельный .cpp-файл в проекте. Это самое разумное решение — чтобы каждый занимался своим делом: заголовочный файл содержал заголовки-объявления, а файл реализации — содержал реализацию.
1
Оформил я баг-репорт. Если кто еще столкнется с этим багом в этой библиотеке, а баг все еще не закроют, то есть такой обходной путь:
- Вместо
IRremote.h
нужно везде инклудитьIRremoteInt.h
. В этом файле описаны все описания классов. - Ровно в одном cpp файле проекта пишем
#include <IRremote.h>
. Тогда реализация подтягивается только один раз и проект компилируется.
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
IRremote — ссылка на Arduino
Связь
Отправляйте и получайте инфракрасные сигналы с несколькими протоколами
В настоящее время включены протоколы: Denon/Sharp, JVC, LG/LG2, NEC/Onkyo/Apple, Panasonic/Kaseikyo, RC5, RC6, Samsung, Sony, (Pronto), BoseWave, Lego, Whynter, MagiQuest. Новое: добавлен протокол NEC2 . Улучшенный протокол Magiquest. Добавлена функция sendPulseDistanceWidth(). Примечания к выпуску
Автор: shirriff, z3t0, ArminJo
Сопровождающий: Армин Йоахимсмайер
Прочитать документацию
Перейти в репозиторий
Совместимость
Эта библиотека совместима с avr, megaavr, samd, esp8266, esp32, stm32, STM32F1, mbed, mbed_nano, 0rp2040 архитектуры, так что вы должны быть в состоянии использовать его на следующие платы Arduino:
- Arduino Micro
- Ардуино Леонардо
- Ардуино Мега
- Ардуино МКР ФОКС 1200
- Ардуино МКР GSM 1400
- Ардуино МКР НБ 1500
- Ардуино МКР ВИДОР 4000
- Arduino MKR WAN 1300 (подключение LoRa)
- Ардуино МКР WAN 1310
- Ардуино МКР Wi-Fi 1010
- Arduino MKR ZERO (шина I2S и SD для звука, музыки и цифровых аудиоданных)
- Arduino MKR1000 WI-FI
- Ардуино Нано
- Ардуино Нано 33 BLE
- Ардуино Нано 33 Интернет вещей
- Ардуино Нано Каждый
- Ардуино Уно
- Arduino Uno Wi-Fi REV2
- Ардуино Юн
- Ардуино ноль
Примечание о совместимости
Примечание: хотя предполагается, что библиотека правильно компилируется на этих архитектурах,
для этого могут потребоваться определенные аппаратные функции, которые могут быть доступны только на некоторых платах.
Выпуски
Чтобы использовать эту библиотеку, откройте Диспетчер библиотек в в Arduino IDE и установите его оттуда.
- 3.9.0 (последний)
- 3.8.0
- 3.7.1
- 3.7.0
- 3.6.1
- 3.6.0
- 3.5.2
- 3.5.1
- 3.5.0
- 3.4.0
- 3.3.0
-
3.
2.0
- 3.1.0
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.8.1
- 2.8.0
- 2.7.0
- 2.6.1
- 2.6.0
- 2.5.0
- 2.2.3
- 2.0.1
-
1.
0.0
IRremote — библиотеки Arduino
Отправка и получение инфракрасных сигналов по нескольким протоколам
- Автор
- shirriff, z3t0, ArminJo
- Сопровождающий
- Армин Йоахимсмейер
- Веб-сайт
- https://github.com/Arduino-IRremote/Arduino-IRremote
- Гитхаб
- https://github.com/z3t0/Arduino-IRremote
- Категория
- Связь
- Лицензия
- НЕТ УТВЕРЖДЕНИЯ
- Тип библиотеки
- Добавлено
- Архитектуры
- avr, megaavr, samd, esp8266, esp32, stm32, STM32F1, mbed, mbed_nano, rp2040
В настоящее время включены протоколы: Denon/Sharp, JVC, LG/LG2, NEC/Onkyo/Apple, Panasonic/Kaseikyo, RC5, RC6, Samsung, Sony, (Pronto), BoseWave, Lego, Whynter, MagiQuest.
Новое: добавлен протокол NEC2. Улучшенный протокол Magiquest. Добавлена функция sendPulseDistanceWidth().

Примечания к выпуску