std :: errc ABI可移植性

时间:2016-04-26 00:57:47

标签: c++ c++11 libstdc++

我从源代码构建了this project。我有一个设置,命中这个代码路径:

if (err != std::errc::no_such_file_or_directory) {
    Ctx.Diags.diagnose(moduleID.second, diag::sema_opening_import,
                       moduleID.first, err.message());
  }

在我的系统(Debian Jessie)上,此条件评估为false。因此,我们不会致电Ctx.Diags.diagnose

然而,我把我构建的二进制文件交给了一个运行Ubuntu的朋友。在他的系统完全相同的条件下,if语句的计算结果为true,err.message()No such file or directory

怎么可能?我以为std::errc应该是可移植的?根据POSIX的要求,ENOENT在两个系统上均为2

我认为这与他的系统上的libstd在运行时与我在构建时的系统上的不同有所不同,但我不明白为什么,或者如何构建可移植版本。

1 个答案:

答案 0 :(得分:0)

@ T.C。上述评论中的假设是正确的。

ABI for C ++ 11的功能在GCC 4.9中的实验性C ++ 0x支持和GCC 5.x中完成的C ++ 11支持之间发生了变化,所以如果你的代码使用C ++ 11,你可以&#39 ;使用GCC 4.9进行编译,然后使用GCC 5中的libstdc ++。

这是PR 66438。我将其视为无效,因为混合4.9和5.x对C ++ 11代码不起作用。