【问题标题】:Why are includes not compatible with RTCZero library?为什么包含与 RTCZero 库不兼容?
【发布时间】:2020-06-15 00:23:25
【问题描述】:

长话短说,一段时间后,我正在使用 RTCZero 库创建警报以唤醒我的 arduino,但我已经确定,当我添加更多传感器和更多库时,RTC 库与它们不兼容。我认为这是我的 include 引起的,但问题仍然存在。有什么解决办法吗?

!!!编辑!!!

更准确地说,我发现有问题的库只有这些:在这里你可以下载整个库(包含在这个脚本中)。 https://github.com/charles-the-forth/openCanSat-library

#include <Adafruit_BME280.h> 
#include <Adafruit_INA219.h>
#include "Open_Cansat_GPS.h"
#include "RFM69.h"

这里包括

#include <Adafruit_BME280.h>  // include Adafruit BME280 library
#include <Adafruit_INA219.h>  // include INA219
#include <SD.h>          // include Arduino SD library
#include "Open_Cansat_GPS.h"

//include our new sensors
#include <MICS6814.h>
#include <MICS-VZ-89TE.h>
#include "MQ131.h"
#include <Wire.h>

#include "RFM69.h"       // include RFM69 library
#include <SPI.h>
#include <RTCZero.h>

这里是错误

Arduino: 1.8.10 (Windows 10), Vývojová deska: "Arduino M0"

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp: In member function 'uint32_t RTCZero::getEpoch()':

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:379:13: error: aggregate 'RTCZero::getEpoch()::tm tm' has incomplete type and cannot be defined

   struct tm tm;

             ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:391:10: error: 'mktime' was not declared in this scope

   return mktime(&tm);

          ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:391:10: note: suggested alternative: 'mktemp'

   return mktime(&tm);

          ^~~~~~

          mktemp

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp: In member function 'void RTCZero::setAlarmEpoch(uint32_t)':

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:22: error: 'gmtime' was not declared in this scope

     struct tm* tmp = gmtime(&t);

                      ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:22: note: suggested alternative: 'setTime'

     struct tm* tmp = gmtime(&t);

                      ^~~~~~

                      setTime

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:409:21: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmDate(tmp->tm_mday, tmp->tm_mon + 1, tmp->tm_year - EPOCH_TIME_YEAR_OFF);

                     ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:409:23: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmDate(tmp->tm_mday, tmp->tm_mon + 1, tmp->tm_year - EPOCH_TIME_YEAR_OFF);

                       ^~~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:409:35: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmDate(tmp->tm_mday, tmp->tm_mon + 1, tmp->tm_year - EPOCH_TIME_YEAR_OFF);

                                   ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:409:37: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmDate(tmp->tm_mday, tmp->tm_mon + 1, tmp->tm_year - EPOCH_TIME_YEAR_OFF);

                                     ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:409:52: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmDate(tmp->tm_mday, tmp->tm_mon + 1, tmp->tm_year - EPOCH_TIME_YEAR_OFF);

                                                    ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:409:54: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmDate(tmp->tm_mday, tmp->tm_mon + 1, tmp->tm_year - EPOCH_TIME_YEAR_OFF);

                                                      ^~~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:410:21: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmTime(tmp->tm_hour, tmp->tm_min, tmp->tm_sec);

                     ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:410:23: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmTime(tmp->tm_hour, tmp->tm_min, tmp->tm_sec);

                       ^~~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:410:35: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmTime(tmp->tm_hour, tmp->tm_min, tmp->tm_sec);

                                   ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:410:37: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmTime(tmp->tm_hour, tmp->tm_min, tmp->tm_sec);

                                     ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:410:48: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmTime(tmp->tm_hour, tmp->tm_min, tmp->tm_sec);

                                                ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:410:50: error: invalid use of incomplete type 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     setAlarmTime(tmp->tm_hour, tmp->tm_min, tmp->tm_sec);

                                                  ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:407:12: note: forward declaration of 'struct RTCZero::setAlarmEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp: In member function 'void RTCZero::setEpoch(uint32_t)':

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:22: error: 'gmtime' was not declared in this scope

     struct tm* tmp = gmtime(&t);

                      ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:22: note: suggested alternative: 'setTime'

     struct tm* tmp = gmtime(&t);

                      ^~~~~~

                      setTime

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:426:29: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.YEAR = tmp->tm_year - EPOCH_TIME_YEAR_OFF;

                             ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:426:31: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.YEAR = tmp->tm_year - EPOCH_TIME_YEAR_OFF;

                               ^~~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:427:30: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.MONTH = tmp->tm_mon + 1;

                              ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:427:32: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.MONTH = tmp->tm_mon + 1;

                                ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:428:28: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.DAY = tmp->tm_mday;

                            ^~

Byly nalezené násobné knihovny "Wire.h"
 Použitý: C:\Users\Marty\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.4\libraries\Wire
Byly nalezené násobné knihovny "SD.h"
 Použitý: C:\Users\Marty\Documents\Arduino\libraries\SD
 Nepoužitý: C:\Program
C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

Byly nalezené násobné knihovny "MICS6814.h"
     struct tm* tmp = gmtime(&t);

 Použitý: C:\Users\Marty\Documents\Arduino\libraries\arduino-mics-6814-master
            ^~

Byly nalezené násobné knihovny "MICS-VZ-89TE.h"
C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:428:30: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

 Použitý: C:\Users\Marty\Documents\Arduino\libraries\MICS-VZ-89TE-master
Byly nalezené násobné knihovny "MQ131.h"
     clockTime.bit.DAY = tmp->tm_mday;

 Použitý: C:\Users\Marty\Documents\Arduino\libraries\mq131
                              ^~~~~~~

 Nepoužitý: C:\Users\Marty\Documents\Arduino\libraries\ozone
 Nepoužitý: C:\Users\Marty\Documents\Arduino\libraries\hjj
Byly nalezené násobné knihovny "SPI.h"
 Použitý: C:\Users\Marty\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.4\libraries\SPI
C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

Byly nalezené násobné knihovny "RTCZero.h"
C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:429:29: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

 Použitý: C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master
     clockTime.bit.HOUR = tmp->tm_hour;

                             ^~

Byly nalezené násobné knihovny "Adafruit_BME280.h"
 Použitý: C:\Users\Marty\Documents\Arduino\libraries\openCanSat-2.0-library-master
C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:429:31: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.HOUR = tmp->tm_hour;

                               ^~~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:430:31: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.MINUTE = tmp->tm_min;

                               ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:430:33: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.MINUTE = tmp->tm_min;

                                 ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:431:31: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.SECOND = tmp->tm_sec;

                               ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:431:33: error: invalid use of incomplete type 'struct RTCZero::setEpoch(uint32_t)::tm'

     clockTime.bit.SECOND = tmp->tm_sec;

                                 ^~~~~~

C:\Users\Marty\Documents\Arduino\libraries\RTCZero-master\src\RTCZero.cpp:422:12: note: forward declaration of 'struct RTCZero::setEpoch(uint32_t)::tm'

     struct tm* tmp = gmtime(&t);

            ^~

exit status 1
Nastala chyba při kompilaci u desky Arduino M0.

Táto zpráva by měla mít víc informacií v
"Zobrazení podrobného výstupu při kompilaci"
podle zapnuté volby v Soubor -> Nastavení.

【问题讨论】:

    标签: c++ c struct compiler-errors arduino


    【解决方案1】:

    RTCZero.cpp 中可以看到#include &lt;time.h&gt; 是标准头文件,库依赖它。

    在链接库 (openCanSat) 中,您可以看到 Time.h 和 Time.cpp,它们是时间函数的一些自定义实现,它与标准 time.h 完全不兼容。然而,由于 Arduino IDE 是一个虚拟 IDE,Time.h 优先于time.h(这不会发生在具有区分大小写文件系统的操作系统上——如 linux、osx 等)。所以你可以在库中重命名 Time.h,也可以尝试将 #include &lt;time.h&gt; 更改为 #include &lt;ctime&gt;,但它可能也包括 time.h,所以...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 2017-10-08
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2021-05-06
      • 2021-04-04
      相关资源
      最近更新 更多