You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:15:00