C++在signal中使用类静态函数报undefined reference如何解决
问题修复方案
你遇到的是C++静态成员链接错误+语法不规范问题,按以下步骤修改即可:
1 修复头文件语法错误
你的类定义末尾缺少C++要求的强制分号,会干扰后续符号解析,修改后头文件代码如下:
class data_collector { public: data_collector(); data_collector(RestController restController , data_handler handler); //constructor void intHandler(int dummy); static void static_intHandler(int dummy); private: static data_collector instance; }; // 新增结尾分号
2 修复静态成员定义类型不匹配问题
你在cpp中定义静态成员instance时错误使用了struct关键字,和头文件中class的类型声明冲突,会导致链接器无法匹配到instance的定义,同时删掉全局作用域下非法的signal调用语句,修改后cpp代码如下:
// 去掉struct关键字,和类声明类型保持一致 data_collector data_collector::instance; data_collector::data_collector(RestController restController, data_handler handler) //constructor { signal(SIGINT, data_collector::static_intHandler); } void data_collector::intHandler(int dummy) { keepRunning = false; pcieio_stop_channel(&dma_channel.dcd); } void data_collector::static_intHandler(int dummy) { data_collector::instance.intHandler(dummy); } // 删掉全局作用域下的signal调用,可执行语句不能放在函数外,且你构造函数中已经完成了信号注册
3 补充缺失的默认构造函数实现
你头文件中声明了无参默认构造函数data_collector();,需要在cpp中补充它的实现,否则静态成员instance初始化时会报未定义构造函数的错误:
// 补充到cpp中即可,无特殊逻辑可以留空 data_collector::data_collector() = default;
修改完成后执行make clean清除旧编译产物,再重新编译即可解决链接错误。
内容的提问来源于stack exchange,提问作者Meyer Buaharon
相关产品推荐
相关产品推荐

