ソースからthis projectをビルドしました。std :: errc ABI移植性
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
は移植されていると思いますか? ENOENT
は、両方のシステムで2
です(POSIXで必要とされます)。
これは、自分のシステム上で実行時にlibstdと関係があり、ビルド時に私のシステムにあるものとは異なると思われますが、その理由や移植可能なバージョンの構築方法はわかりません。
関連するGCCのバージョンは何ですか? –
'!='の比較でシーンの裏には多くのことが起こっています。結局、2つの 'error_category'を同一性のために比較します。 GCC 5は 'std :: string'の変更のために' error_category'関連のものにABI変更を行っているので、実際には2つの 'generic_category()'と2つの 'system_category()'を持っています(新しいバージョンはインラインネームスペースで)。あなたのコードがどうにかして2つを混ぜ合わせると、その動作を説明することができます。 –
GCCがインストールされていません。このプロジェクトは実際にclang-3.5-10(Jessie)で構築され、Ubuntuマシンはclang-3.6.2-1を持っていました。私は* lib * gcc、libgcc-4.9.2-10、そしてUbuntuシステムはlibgcc-5.2.1-22ubuntu2を持っています。 – Drew