我已经构建了 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/