私はLLVMからcannot select intrinsic
エラーが出るので、clang/llvmでSSE4.2組み込み関数を使用しようとしていますが、コンパイルしていません。一方、同じコードはgccで完璧にコンパイルされます。だから私は多分gccでその関数をコンパイルして、オブジェクトやライブラリファイルを持っていて、clang/llvmによってコンパイルされた自分のコードでそのライブラリ関数を呼び出すことができると思った。それは働くだろうか?gccで関数をコンパイルしてからclangで使用できますか?
答えて
複雑なC++コード(vtableにコンパイルされたものなど)については、答えはNOです。 2つは互換性がありません。
上記の点を説明するために、Crypto++ライブラリをg ++でコンパイルしてみましょう(AES/GCMの速度は約40%向上します)。
自分自身の答えを修正する:はいできます。 "clang ++ -stdlib = libstdC++"でコードをコンパイルしてください。それから、g ++コンパイルされたライブラリ(Crypto ++を含む)に正しくリンクされます。残念ながら、その逆はうまくいきません。g ++のコンパイル済みコードは、どんなフラグを使用しても、clang ++コンパイルされたライブラリでは動作しません。 :-( – Mouse
これは機能しない場合があります。 ABIのいくつかの要素は同じであると予想することができます。たとえば、g ++とclangの両方がItanium ABIネームマングリングスキームを使用していると思います。他の要素はできません。したがって、コンパイルするコードの複雑さによって異なります。
また、私はLLVM bugを選択できなかった組み込み関数に対してオープンすることをお勧めします。 ClangとLLVMは非常に活発なコミュニティを持ち、誰かがすぐにバグを選ぶ可能性があります。
質問にはCタグが付いているので、ABI全体が同じであると予想されます。 –
あなたは正しいですが、私は質問を誤解しました バグについての部分は立っています。 – Marvin
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つのプラットフォームのみのシステムコールに依存している場合)。詳細は上記のリンクを参照してください。
- 1. clangでコンパイルされたコードでGCC拡張を使用していますか?私はGCCの属性/エクステンションを使用してライブラリをコンパイルする場合
- 2. MacportsのGCCを使ってユニバーサルコードをコンパイルできますか?
- 3. GCC/Clangでテールコールの最適化を強制できますか?
- 4. 私のMacでコンパイルすると、 "gcc"を使用してコンパイルできますが、clangではなくこのエラーが発生します。++
- 5. 再帰的テンプレート関数はClangでコンパイルされませんか?
- 6. clangがgccを使用しているようです
- 7. 引数atan2/powでstd :: transformsをコンパイルするのがclangで失敗しますが(gccで動作します)
- 8. gccを使用してコンパイルすると、関数と変数の前に "_"が付きますか?
- 9. clang ++オプションとは何ですか?GDB内部でstd :: coutを関数パラメータとして使用できます
- 10. "gcc"を使ってコンパイルできない
- 11. CLANGでコンパイルするとGDB for GCCと同等のデバッグがありますか?
- 12. これはバグですか?clangまたはgccですか?
- 13. 特定のgccツールチェーンを使用してソースからclangを構築する
- 14. GCCで使用される関数rem_pio2f()は何ですか?
- 15. clang-clを使用してopenmpでCコードをコンパイル
- 16. GCCでBOMソースファイルを使用してUTF-8をコンパイルすることはできますか?
- 17. GCC/Clangの-frameworkオプションはLinuxで動作しますか?
- 18. iOSでxapian、clucene、lucyをコンパイルして使用できますか?
- 19. Macでgccコンパイラを使用してC++ SDL2プログラムをコンパイルする
- 20. clangのuint24_tはどのように機能しますか? clang/LLVM以外でも使用できますか?
- 21. OpenWRT内でgccを使用してコンパイルする方法
- 22. カスタムgccとglibcツールチェーンでclangを使用する
- 23. gccはgccスタイルのネストされたC関数をデバッグできますか?
- 24. SFINAEを使用し、GCCで動作しますがClangでは使用しないコード
- 25. 関数をパラメータとして使用できますか?
- 26. JavaScript:Booleanオブジェクトをコールバック関数として使用できますか?
- 27. オブジェクトをOOJSの関数として使用できますか?
- 28. GCCプログラムをコンパイルできません
- 29. GCCを使用して、特定のコンパイラフラグを持つコードファイルの1つのセクションをコンパイルできますか?
- 30. mingw32-gccコンパイラを使用してC#コードからプログラムコードをコンパイルする方法
おそらく。それはあなたのシステムによって異なります。マック? Linux? Windows?一般に、clangとgccで構築されたオブジェクトファイルを混在させることができます。しかし、同じ標準ライブラリ( 'libC++'と 'libstdC++'を混在させないでください)を使用してください。 –
プレーンCの場合、ほとんど保証されています。そこのすべてのコンパイラは共通の_ABI_(アプリケーション実行バイナリインタフェース、つまり実行転送/呼び出し関数、パラメータの受け渡しと返送、データ構造の整理/変数の整列)と同じメカニズムを使用します。 C++の場合、これは一般的ではありません(gcc/MinGWからMicrosoft Visual C++コードを呼び出すことはできません)。gcc/clangの場合は同じCとC++を使用しますABI、したがってバイナリコードは互換性があります:http://stackoverflow.com/questions/11682748/is-clang-ab-same-as-g –
@FrankH。、MSVCからGCCコードを呼び出すことができます(私の答えを参照)。実際、あなたはGCCからMSVCを呼び出すことができます(しかし、GCCは最適化の方がはるかに優れているのでわからないのですが).MSVCはUnix関数呼び出し規約を作成する方法を提供していないので、オブジェクトが作成された後で行います。より制限的です(例えば、4つのパラメータを持つ関数の場合のみ)。 –