2013-05-03 23 views
7

私はLLVMからcannot select intrinsicエラーが出るので、clang/llvmでSSE4.2組み込み関数を使用しようとしていますが、コンパイルしていません。一方、同じコードはgccで完璧にコンパイルされます。だから私は多分gccでその関数をコンパイルして、オブジェクトやライブラリファイルを持っていて、clang/llvmによってコンパイルされた自分のコードでそのライブラリ関数を呼び出すことができると思った。それは働くだろうか?gccで関数をコンパイルしてからclangで使用できますか?

+3

おそらく。それはあなたのシステムによって異なります。マック? Linux? Windows?一般に、clangとgccで構築されたオブジェクトファイルを混在させることができます。しかし、同じ標準ライブラリ( 'libC++'と 'libstdC++'を混在させないでください)を使用してください。 –

+5

プレーンCの場合、ほとんど保証されています。そこのすべてのコンパイラは共通の_ABI_(アプリケーション実行バイナリインタフェース、つまり実行転送/呼び出し関数、パラメータの受け渡しと返送、データ構造の整理/変数の整列)と同じメカニズムを使用します。 C++の場合、これは一般的ではありません(gcc/MinGWからMicrosoft Visual C++コードを呼び出すことはできません)。gcc/clangの場合は同じCとC++を使用しますABI、したがってバイナリコードは互換性があります:http://stackoverflow.com/questions/11682748/is-clang-ab-same-as-g –

+1

@FrankH。、MSVCからGCCコードを呼び出すことができます(私の答えを参照)。実際、あなたはGCCからMSVCを呼び出すことができます(しかし、GCCは最適化の方がはるかに優れているのでわからないのですが).MSVCはUnix関数呼び出し規約を作成する方法を提供していないので、オブジェクトが作成された後で行います。より制限的です(例えば、4つのパラメータを持つ関数の場合のみ)。 –

答えて

0

複雑なC++コード(vtableにコンパイルされたものなど)については、答えはNOです。 2つは互換性がありません。

上記の点を説明するために、Crypto++ライブラリをg ++でコンパイルしてみましょう(AES/GCMの速度は約40%向上します)。

+3

自分自身の答えを修正する:はいできます。 "clang ++ -stdlib = libstdC++"でコードをコンパイルしてください。それから、g ++コンパイルされたライブラリ(Crypto ++を含む)に正しくリンクされます。残念ながら、その逆はうまくいきません。g ++のコンパイル済みコードは、どんなフラグを使用しても、clang ++コンパイルされたライブラリでは動作しません。 :-( – Mouse

0

これは機能しない場合があります。 ABIのいくつかの要素は同じであると予想することができます。たとえば、g ++とclangの両方がItanium ABIネームマングリングスキームを使用していると思います。他の要素はできません。したがって、コンパイルするコードの複雑さによって異なります。

また、私はLLVM bugを選択できなかった組み込み関数に対してオープンすることをお勧めします。 ClangとLLVMは非常に活発なコミュニティを持ち、誰かがすぐにバグを選ぶ可能性があります。

+1

質問にはCタグが付いているので、ABI全体が同じであると予想されます。 –

+0

あなたは正しいですが、私は質問を誤解しました バグについての部分は立っています。 – Marvin

4

LinuxでGCCを使ってオブジェクトファイルをコンパイルし、Visual Studioでこのファイルを変換することができます。私はこれを最近Windowsのバーチャルボックスconverting-c-object-file-from-linux-o-to-windows-objで実行しています。これは、LinuxまたはWindowsのClangでも可能であるはずです。

これは、クロスプラットフォームのクロスプラットフォームで実行できるだけでなく、クロスプラットフォームでも実行できます。

呼び出し規約とオブジェクトファイル形式を正しく取得する必要があります(C++ではmanglingも同様です)。コンパイル時にGCCを使用すると、どの呼び出し規約/ APIにmabiを使用するかを指示できます。その後、LinuxからWindowsに移行する場合は、オブジェクトファイルコンバータが必要です。 WindowsのCOFFへのLinuxのELFもちろん、おそらくこれがうまくいかない場合があります(たとえば、モジュールが1つのプラットフォームのみのシステムコールに依存している場合)。詳細は上記のリンクを参照してください。

関連する問題