C++ 使用lambda时未定义的引用

C++ 使用lambda时未定义的引用,c++,c++11,gcc,lambda,linker,C++,C++11,Gcc,Lambda,Linker,以下代码在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) { };

以下代码在
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();
}
#包括
类Lol{
公众:
void foo(){
struct-sigaction-sa;
sa.sa_标志=0;
sigemptyset(和sa.sa_面具);
sa.sa_handler=[](int){
};
sigation(SIGTERM和sa,0);
}
};
int main(){
Lol;
l、 foo();
}
lev@debi7~$C++ +STD= C++ 11 -O-LOL LOL.CPP /tmp/ccWFXAT9.o:在函数'Lol::foo():{lambda(int)#1}::operator void(*)(int)const:'Lol.cpp(.text.ZZN3Lol3fooEvENKUliE_cvPFviEEv[ZZN3Lol3fooEvENKUliE_cvPFviEEv]+09]:对'Lol::foo()的引用未定义:{lambda(int)#1:#FUN(int)#collect2:错误:ld返回1退出状态 lev@debi7~$C++ +版本 C++(Debian 4.7.2-5)4.7.2 然而,它在
g++-4.7.real(Ubuntu/Linaro 4.7.4-3ubuntu3)4.7.4
上编译/链接非常好


这里发生了什么?

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

在4.7系列中,gcc对C++11的支持仍然很成熟,而且大部分都是不完整的。如果当时4.7分支中没有任何与C++11相关的bug,我会感到惊讶。如果要筛选4.7.2和4.7.4之间的变更日志,我相信在其中的某个地方会有一个模糊的条目,指示适用于此处用例的错误修复


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

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

在4.7系列中,gcc对C++11的支持仍然很成熟,而且大部分都是不完整的。如果当时4.7分支中没有任何与C++11相关的bug,我会感到惊讶。如果要筛选4.7.2和4.7.4之间的变更日志,我相信在其中的某个地方会有一个模糊的条目,指示适用于此处用例的错误修复


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

谢谢!但是我必须支持Debian 7,所以如果我切换到4.8+之类的版本,我可能会因为libc6的不同而遇到麻烦。解决方法可能是使用
内联
声明
foo
;这将有助于编译器可能不会使其成为一个符号。谢谢!但是我必须支持Debian 7,所以如果我切换到4.8+之类的版本,我可能会因为libc6的不同而遇到麻烦。解决方法可能是使用
内联
声明
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