以下代码在undefined reference上产生c++ (Debian 4.7.2-5) 4.7.2错误:

#include <signal.h>

class Lol {
public:
    void foo() {
        struct sigaction sa;
        sa.sa_flags = 0;
        sigemptyset(&sa.sa_mask);
        sa.sa_handler = [](int) {
        };
        sigaction(SIGTERM, &sa, 0);
    }
};

int main() {
    Lol l;
    l.foo();
}


lev @ debi7:〜$ c ++ -std = c ++ 11 -o哈哈lol.cpp

/tmp/ccWFXAT9.o:在函数`Lol :: foo():: {lambda(int)#1} :: operator void(*)(int)()const':lol.cpp(.text._ZZN3Lol3fooEvENKUliE_cvPFviEEv [ _ZZN3Lol3fooEvENKUliE_cvPFviEEv] +0 9):对`Lol :: foo():: {lambda(int)#1} :: _ FUN(int)'的未定义引用collect2:错误:ld返回1退出状态


lev @ debi7:〜$ c ++ --version
c ++(Debian 4.7.2-5)4.7.2


但是,它可以在g++-4.7.real (Ubuntu/Linaro 4.7.4-3ubuntu3) 4.7.4上完美地编译/链接。

这里发生了什么?

最佳答案

显示的代码没有任何问题。显然,这是一个编译器错误。像Debian这样的社区Linux发行版按原样打包上游代码(如gcc),而不会从后续补丁程序版本中移植其他补丁,这并不少见。 gcc版本的最后一个组件指示补丁/修复级别。 4.7.4是4.7.2编译器之后的两个补丁程序级别,它表现出此错误。

在4.7系列中,gcc对C ++ 11的支持仍在日趋完善,并且大多不完整。如果那时4.7分支中没有任何C ++ 11相关的错误,我会感到惊讶。如果要浏览4.7.2和4.7.4之间的变更日志,我敢肯定那里会有一个晦涩的条目,这表明一个错误修复适用于此处的用例。

如果需要对C ++ 1x的强大支持,则需要汇总到当前的5.3 gcc。

关于c++ - 使用Lambda时未定义引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35131734/

10-16 04:35