c++ - std::errc ABI 可移植性

标签 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 的 friend 。在他的系统上完全相同的条件下,if 语句的计算结果为真,并且 err.message()No such file or directory

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

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

最佳答案

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

C++11 的 ABI 功能在 GCC 4.9 中的实验性 C++0x 支持和 GCC 5.x 中完成的 C++11 支持之间发生了变化,因此如果您的代码使用 C++11,则不能使用 GCC 4.9 编译,然后使用 GCC 5 中的 libstdc++。

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

关于c++ - std::errc ABI 可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36853600/

相关文章:

linux - 如何为 RHEL 6 找到 libstdc++.so.6 : that contain GLIBCXX_3. 4.19?

LLVM 交叉编译无法创建动态重定位 R_ARM_ABS32

c++ - 如何将 ASCII 字符的十六进制值写入文本文件?

c++ - C++ 中的 Vector2 类

c++ - 编写 C++ 运算符重载?

c++ - 为什么 constexpr 不会因索引越界而导致编译失败

c++ - 如何使用链表创建交集函数?

带有 char* 键的 C++ unordered_map 产生意外行为

c++ - 是否将指向第一个成员的指针解释为类本身定义良好?

c++ - 使用标准 C++ 库调试符号? Ubuntu/Linux/libstdc++6-8-dbg?