使用lambda时未定义的引用

时间:2016-02-01 13:27:31

标签: c++ c++11 gcc lambda linker

以下代码在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 lol.cpp

/tmp/ccWFXAT9.o: In function `Lol::foo()::{lambda(int)#1}::operator void (*)(int)() const': lol.cpp (.text._ZZN3Lol3fooEvENKUliE_cvPFviEEv[_ZZN3Lol3fooEvENKUliE_cvPFviEEv]+0 9): undefined reference to `Lol::foo()::{lambda(int)#1}::_FUN(int)' collect2: error: ld returned 1 exit status
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上完全编译/链接。

这里发生了什么?

1 个答案:

答案 0 :(得分:4)

显示的代码没有任何问题。这显然是一个编译器错误。在社区Linux发行版(如Debian)中,像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。