使用lambda时未定义的引用
以下代码在c++ (Debian 4.7.2-5) 4.7.2
上产生undefined reference
错误:
#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
上编译/链接完全正确。
这里发生了什么?
显示的代码没有问题。 显然,这是一个编译器错误。 像Debian这样的社区Linux发行版并不少见像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。
链接地址: http://www.djcxy.com/p/51565.html上一篇: Undefined reference when using lambda
下一篇: "undefined reference" to static member of template class accessed from static method