为何Arduino与Eclipse同工具链却出现vtable未定义引用差异?
Arduino的库自动处理机制
Arduino IDE会自动扫描项目引用的库目录,把库中所有相关的.cpp/.c实现文件自动加入编译流程。如果你的CRemoteXYWire类纯虚函数的实现代码在某个库源文件里,Arduino会自动编译这个文件并生成对应的目标文件,链接时自然能找到vtable。而Eclipse不会自动做这件事——如果没手动把该类的实现文件添加到项目的编译列表中,链接阶段就会找不到vtable的定义。链接命令的输入差异
对比两个IDE的链接命令就能发现:Arduino的链接命令里会包含所有库对应的目标文件(.o),或者通过库链接选项(比如-lxxx)引入这些依赖;而你的Eclipse链接命令大概率遗漏了CRemoteXYWire类实现对应的目标文件。工具链是同款,但输入给链接器的文件集合不一样,结果必然不同。纯虚函数的实例化逻辑
如果代码中实例化了CRemoteXYWire类(或者该类作为非抽象基类被继承后实例化),必须要有纯虚函数的具体实现。Arduino环境下的库已经提供了这些实现,而Eclipse项目因为没引入实现文件,导致链接器无法生成对应的vtable。
以你提供的头文件片段为例:
// RemoteXYWire.h 部分代码
class CRemoteXYWire {
public:
virtual void send(uint8_t data) = 0; // 纯虚函数
virtual uint8_t receive() = 0;
// ... 其他成员声明
};
如果库中有RemoteXYWire.cpp实现了这两个纯虚函数,Eclipse项目必须把这个cpp文件加入编译,否则链接器找不到vtable的定义。
内容的提问来源于stack exchange,提问作者kv193

