2016-04-26 14 views
1

ソースから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と関係があり、ビルド時に私のシステムにあるものとは異なると思われますが、その理由や移植可能なバージョンの構築方法はわかりません。

+0

関連するGCCのバージョンは何ですか? –

+1

'!='の比較でシーンの裏には多くのことが起こっています。結局、2つの 'error_category'を同一性のために比較します。 GCC 5は 'std :: string'の変更のために' error_category'関連のものにABI変更を行っているので、実際には2つの 'generic_category()'と2つの 'system_category()'を持っています(新しいバージョンはインラインネームスペースで)。あなたのコードがどうにかして2つを混ぜ合わせると、その動作を説明することができます。 –

+0

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

答えて

0

上記のコメントのT.C.仮説は正しい。

ABI for C++ 11の機能は、GCC 4.9の実験的なC++ 0xサポートとGCC 5.xの完成したC++ 11のサポートの間で変更されています。したがって、コードでC++ 11を使用すると、 t GCC 4.9でコンパイルし、GCC 5のlibstdC++を使用します。

これはPR 66438です。 4.9と5.xを混在させるとC++ 11のコードではうまくいかないので、私は無効としてクローズしました。