TaskScheduler-Library的预处理不起作用 - 多重定义错误

时间:2018-05-11 11:38:12

标签: c++ arduino taskscheduler

我遇到了为整个图书馆获取多个定义errors的问题。 只要我将TaskScheduler库包含在另一个header-file.ino除外)中,我就会获得error

澄清:下面不是我想要修复的实际代码!我将它减少到仍然具有error的最小值(在Eclipse sloeber和Arduino IDE 中测试):

Project.ino:

#include <TaskScheduler.h>
#include "WifiHelper.h"

void setup(){}
void loop(){}

WifiHelper.h:

#ifndef WIFIHELPER_H_
#define WIFIHELPER_H_

#include <TaskScheduler.h>

#endif /* WIFIHELPER_H_ */

WifiHelper.cpp:

#include "Wifihelper.h"

您可以下载项目here

那么为什么我需要在这里两次包含TaskScheduler.h? 好的,类WifiHelper.h会收到类型为Scheduler的指针,并在其构造函数Task中的文件WifiHelper.cpp中启动WifiHelper::WifiHelper(std::shared_prt<Scheduler> scheduler){...}

TaskScheduler.h有一个预处理器语句,我真的不明白为什么我在这里遇到这个问题。在我原来的项目中,我正在使用如上所述的其他几个库,一切正常。总之,我想知道这是否是图书馆的问题......

提前谢谢你:)

errormessage的一部分:

'Starting combiner'
"C:/Users/Mimi/Documents/Arduino/hardware/espressif/esp32/tools/xtensa/esp32-elf/bin/xtensa-esp32-elf-gcc" -nostdlib "-LC:/Users/Mimi/Documents/Arduino/hardware/espressif/esp32/tools/sdk/lib" "-LC:/Users/Mimi/Documents/Arduino/hardware/espressif/esp32/tools/sdk/ld" -T esp32_out.ld -T esp32.common.ld -T esp32.rom.ld -T esp32.peripherals.ld -T esp32.rom.spiram_incompatible_fns.ld -u ld_include_panic_highint_hdl -u call_user_start_cpu0 -Wl,--gc-sections -Wl,-static -Wl,- undefined=uxTopUsedPriority -u __cxa_guard_dummy -u __cxx_fatal_exception -Wl,--start-group    .\WifiHelper.cpp.o .\sloeber.ino.cpp.o   "C:/Users/Mimi/eclipse-workspaces/esp32/Project2/Release/arduino.ar" -lgcc -lopenssl -lbtdm_app -lfatfs -lwps -lcoexist -lwear_levelling -lhal -lnewlib -ldriver -lbootloader_support -lpp -lmesh -lsmartconfig -ljsmn -lwpa -lethernet -lphy -lapp_trace -lconsole -lulp -lwpa_supplicant -lfreertos -lbt -lmicro-ecc -lcxx -lxtensa-debug-module -lmdns -lvfs -lsoc -lcore -lsdmmc -lcoap -ltcpip_adapter -lc_nano -lrtc -lspi_flash -lwpa2 -lesp32 -lapp_update -lnghttp -lspiffs -lespnow -lnvs_flash -lesp_adc_cal -llog -lexpat -lm -lc -lheap -lmbedtls -llwip -lnet80211 -lpthread -ljson -lstdc++ -Wl,--end-group -Wl,-EL -o "C:/Users/Mimi/eclipse-workspaces/esp32/Project2/Release/Project2.elf" C:/Users/Mimi/eclipse-workspaces/esp32/Project2/Release/arduino.ar
.\sloeber.ino.cpp.o: In function `Task::isEnabled()':
C:\Users\Mimi\Documents\Arduino\libraries\TaskScheduler\src/TaskScheduler.h:312: multiple definition of `Task::isEnabled()'
.\WifiHelper.cpp.o:C:\Users\Mimi\Documents\Arduino\libraries\TaskScheduler\src/TaskScheduler.h:312: first defined here
.\sloeber.ino.cpp.o: In function `Task::getInterval()':
sloeber.ino.cpp:(.text._ZN4Task11getIntervalEv+0x0): multiple definition of `Task::getInterval()'
.\WifiHelper.cpp.o:WifiHelper.cpp:(.text._ZN4Task11getIntervalEv+0x0): first defined here
.\sloeber.ino.cpp.o: In function `Task::getIterations()':

依此类推 - 如果你想查看完整的消息,请点击here ...最后不要被“Project2.ino”搞糊涂。我只是在另一个具有相同文件的项目中尝试过它。

1 个答案:

答案 0 :(得分:0)

在C / C ++中,如果在2个单独的“转换模块”(即“.cpp”文件)中定义一个函数,则会出现此错误,因为链接器不知道哪个用于最终程序。

你Project.ino似乎编译为它自己的翻译模块 - “sloeber.ino.cpp”,所以如果你在WifiHelper.cppsloeber.ino.cpp中都包含相同的功能定义,你会得到这个错误。

首先确保不要包含两次内容。 绝对确定您可以在#include

周围添加警卫
#ifndef TASK_SCHEDULER_H_INCLUDED
#define TASK_SCHEDULER_H_INCLUDED
#include <TaskScheduler.h>
#endif // TASK_SCHEDULER_H_INCLUDED

查看源代码 - https://github.com/arkhipenko/TaskScheduler/blob/master/src/TaskScheduler.h

这显然不包括两次。

但是还有另一个文件 - TaskSchedulerDeclarations.h,可能会多次包含,所以也许尝试在其他文件中使用该文件。

如果这没有帮助,还有其他解决方法:

  1. 将库函数定义从.h文件移动到.cpp文件,并且只保留.h文件中的函数声明(虽然这可能需要很多工作)
  2. 或在函数定义前添加“static”,这会将它们呈现为翻译模块的本地(单个cpp文件),在这种情况下,在整个程序中有多个它们并不是错误。< / LI>