【问题标题】:Undefined reference when using lambda使用 lambda 时未定义的引用
【发布时间】:2016-05-09 23:24:11
【问题描述】:

以下代码在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:在函数 `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 上编译/链接非常好。

这是怎么回事?

【问题讨论】:

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


    【解决方案1】:

    显示的代码没有任何问题。这显然是一个编译器错误。对于像 Debian 这样的社区 Linux 发行版,按原样打包上游代码(如 gcc)并不罕见,而无需从后续补丁级别向后移植额外的修复。 gcc 版本的最后一个组件表示补丁/修复级别。 4.7.4 是 4.7.2 编译器之后的两个补丁级别,出现了这个错误。

    gcc 对 C++11 的支持在 4.7 系列期间仍处于成熟阶段,而且大多不完整。如果当时在 4.7 分支中没有任何与 C++11 相关的错误,我会感到惊讶。如果要筛选 4.7.2 和 4.7.4 之间的变更日志,我敢肯定那里会有一个晦涩的条目,指示适用于此处用例的错误修复。

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

    【讨论】:

    • 谢谢!不过我必须支持 Debian 7,所以如果我切换到类似 4.8+ 的版本,我可能会因为不同的 libc6 而遇到麻烦。
    • 解决方法可能是用inline 声明foo;这将有助于编译器可能不会使其成为符号。
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多