c++ - TaskScheduler-Library 的预处理不起作用 - 多定义错误
问题描述
我在errors
为整个库获取多个定义时遇到问题。一旦我将TaskScheduler库包含在另一个header-file
(除了.ino
)中,我就会得到error
.
澄清一下:下面不是我想要修复的实际代码!我将它减少到仍然具有error
(在 Eclipse sloeber 和 Arduino IDE中测试)的最小值:
项目.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"
您可以在此处下载该项目。
那么为什么我需要在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()':
依此类推-如果您想查看完整消息,请单击此处...不要被最后的“Project2.ino”弄糊涂了。我只是在另一个具有相同文件的项目中尝试过。
解决方案
在 C/C++ 中,如果您在 2 个单独的“翻译模块”(即“.cpp”文件)中定义一个函数,您将收到此错误,因为链接器不知道将哪个用于最终程序。
您的 Project.ino 似乎编译为它自己的翻译模块 - “sloeber.ino.cpp”,因此如果您在两者中包含相同的函数定义WifiHelper.cpp
,sloeber.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,它可能包含多次,所以也许尝试在你的其他文件中使用该文件。
如果这没有帮助,还有其他解决方法:
- 将库函数定义从 .h 文件移动到 .cpp 文件,并且只将函数声明保留在 .h 文件中(尽管这可能需要做很多工作)
- 或在函数定义前添加“静态”,这会将它们呈现为翻译模块(单个 cpp 文件)的本地,在这种情况下,在整个程序中有多个它们不是错误。
推荐阅读
- html - 如何让我的表单站点在每台设备上工作(响应式)
- ruby-on-rails - 如何在 rails 5 中修复此错误“HasManyThroughCantAssociateThroughHasOneOrManyReflection”?
- python - 根据条件 [PYTHON] 从多维列表中删除子列表
- python - 在 Python 中将多个操作压缩为单行
- javascript - 基于多标准的电子邮件警报触发器
- bash - 向 Ubuntu bashrc 添加行的简单方法
- c - 用 GraphViz 理解 -fdump-tree 输出 gcc
- php - 如何组合 PHP 数组 2D 并使用运算符转换为数组 1D?
- marklogic - MarkLogic "search:suggest" 查找约束名称
- python-3.x - 在 python 中使用多处理进行能源市场模拟