c++ - 在 ARM mbed 中使用回调时 undefined reference

标签 c++ callback linker function-pointers mbed

<分区>

上下文:我正在为 InterruptIn 制作一个开关去抖动包装类,称为 Switch。开关将允许用户附加他们自己的功能,当按下和去抖动真实世界的开关时,这些功能应该被回调。我正在使用 Eclipse C++ 和 arm-none-eabi-* 工具链。

首先,我发现了三种使用 mbed 实现回调的方法:

  1. FunctionPointer 类,已被 ARM 弃用,但 has some documentation (我认为我需要的信息的超链接断开了)。

  2. Callback,编译器告诉我这是在尝试使用已弃用的 FunctionPointer 时执行回调的正确方法TM,但没有文档?

    <
  3. event_callback_t,没有文档,负责调用用户附加函数的函数,参数是int?

我将使用 Callback 方式来显示我遇到的问题,但是这三种方式都会产生相同的编译错误。

开关.h:

#ifndef MBED_SWITCH_H
#define MBED_SWITCH_H

#include "mbed.h"

class Switch {
    private:
        Callback<void()> callback_press_;
        InterruptIn switch_;

        //redacted some debouncing stuff

    public:
        Switch(PinName pin, bool isActiveHigh);
        Switch(PinName pin, bool isActiveHigh, int samplePeriod_us, int sampleCount);

        void attachPress(Callback<void()>); //THE PROBLEM FUNCTIONS
        template<typename T, typename F>
        void attachPress(T* object, F function);
};

#endif

开关.cpp:

#include "Switch.h"
#include "CustomNames.h"

 // redacted constructors here

 //  redacted debouncing functions here

 // for attaching a function not associated with any particular class
void Switch::attachPress(Callback<void()> function) {
    callback_press_.attach(function);
}

 // for attaching a member function of some other class
template<typename T, typename F>
void Switch::attachPress(T* object, F function) {
    callback_press_.attach(object, function);
}

问题

如果我使用第一个候选函数 attachPress(Callback function) 来附加一个与任何特定类无关的函数,那么在现实世界中一切都可以编译、链接和正常工作。

但是,当我尝试将另一个类“Test”的特定成员函数“testfunc1(void)”附加到第二个候选函数时,出现以下错误(我认为来自链接器):

Test.o: In function `Test::Test()':
Test.cpp:(.text._ZN4TestC2Ev+0x1e): undefined reference to `void Switch::attachPress<Test, void (Test::*)()>(Test*, void (Test::*)())'
/home/yankee/programming_projects/cpp-eclipse/SO_EXAMPLE/Makefile:97: recipe for target 'HW4_RACE.elf' failed
collect2: error: ld returned 1 exit status
Makefile:21: recipe for target 'all' failed
make[1]: *** [HW4_RACE.elf] Error 1
make: *** [all] Error 2

03:10:35 Build Finished (took 165ms)

为什么这会给我“ undefined reference ”,有没有办法解决它?

最佳答案

模板类和函数在使用之前不会被实例化。

这意味着,使用模板类和函数的翻译单元需要该模板的完整代码。

在这种情况下,只需移动:

template<typename T, typename F>
void Switch::attachPress(T* object, F function) {
    callback_press_.attach(object, function);
}

Switch.cppSwitch.h 都可以。

关于c++ - 在 ARM mbed 中使用回调时 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40172720/

相关文章:

c++ - 从数字 vector 生成随机数

c++ - 在 C++11 中查找运算符的规则

c++ - 如何从 DLL 中调用外部函数?

PHP/作用域/回调

javascript - jquery 动画回调 - 如何将参数传递给回调

c++ - MinGW-W64 链接器在搜索第三方静态库时跳过不兼容的文件

C++ ostream << 运算符

jQuery如何循环函数

c++ - Mac OS X 链接器

c++ - 在 C++ 源文件中定义链接选项