c++ - 使用 lambda 时 undefined reference

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

以下代码在 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 相关的错误,我会感到惊讶。如果要筛选 4.7.2 和 4.7.4 之间的更新日志,我敢肯定会有一个晦涩的条目,在其中某处,指示适用于此处用例的错误修复。

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

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

相关文章:

c - 在 C 中使用 free() 时出错

c++ - 使用 int 创建 const char*

c++ - 需要编写一个程序,至少接收 4 位数字(3453)并打印出 : "Three thousands four hundreds 5 tens and 3 ones"

c++ - gperftools 中的明显内存泄漏

C++ 特殊成员函数

c++ - C++11强制无条件移动吗?

c++ - 与C++和汇编相关,什么是ebp+8?

templates - std::function<...> 上的重载

c - 使用 GCC 中的 4 位 PowerPC CR0 寄存器

c++ - 带有返回语句的 C++ 函数中的内联汇编