Библиотека irremote h: Arduino: Инфракрасный приёмник и пульт

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.

cpp пишу

#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 IRrecv::IRrecv():
C:\PROGRA~2\Arduino\LIBRAR~1\IRremote\src/irReceive.cpp.h:44: multiple definition of IRrecv::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 function IRrecv::IRrecv():
C:\PROGRA~2\Arduino\LIBRAR~1\IRremote\src/irReceive.cpp.h:44: multiple definition of IRrecv::decode()
CMakeFiles\Controller.dir\src\AirConditionController.

cpp.obj:C:\PROGRA~2\Arduino\LIBRAR~1\IRremote\src/irReceive.cpp.h:44: first defined here

Ошибок очень много, но все они ссылаются на одно место 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

Оформил я баг-репорт. Если кто еще столкнется с этим багом в этой библиотеке, а баг все еще не закроют, то есть такой обходной путь:

  1. Вместо IRremote.h нужно везде инклудить IRremoteInt.h. В этом файле описаны все описания классов.
  2. Ровно в одном 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().
Примечания к выпуску

Имя файла Дата выпуска Размер файла
IRremote-3.9.0.zip 2022-08-31 855,39 КиБ
IRremote-3.8.0.zip 2022-08-06 851,84 КиБ
IRremote-3.7.1.zip 2022-06-28 820,52 КиБ
IRremote-3.7.0.zip 2022-06-03 820,71 КиБ
IRremote-3.6.1.zip 20.02.2022 815,57 КиБ
IRremote-3.6.0.zip 2022-02-18 756,50 КиБ
IRremote-3. 5.2.zip 2021-12-23 741,46 КиБ
IRremote-3.5.1.zip 2021-12-15 740,92 КиБ
IRremote-3.5.0.zip 2021-11-24 731,47 КиБ
IRremote-3.4.0.zip 2021-10-08 714,63 КиБ
IRremote-3.3.0.zip 2021-04-30 285,92 КиБ
IRremote-3.2.0.zip 2021-04-22 276,17 КиБ
IRremote-3.1.0.zip 2021-03-28 263,93 КиБ
IRremote-3.0.3.zip 2021-03-03 219,93 КиБ
IRremote-3.0.2.zip 2021-03-01 219,78 КиБ
IRremote-3.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *