8

clang/llvm で SSE4.2 組み込み関数を使用しようとしていcannot select intrinsicますが、LLVM からエラーが発生するため、コンパイルできません。一方、同じコードは gcc で問題なくコンパイルされます。そこで私は、その関数を gcc でコンパイルして、オブジェクトまたはライブラリ ファイルを作成し、clang/llvm でコンパイルされたコードでそのライブラリ関数を呼び出すことができるのではないかと考えました。それはうまくいくでしょうか?

4

3 に答える 3

4

Linux で GCC を使用してオブジェクト ファイルをコンパイルし、Visual Studio で動作するように変換することができます。私は最近、Windows上のVirtual BoxでLinuxを実行してこれを行いました。これは、LinuxまたはWindows上のClang でも可能になるはずです。

したがって、これはクロス コンパイラで実行できるだけでなく、クロス プラットフォームでも実行できます

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

于 2014-01-27T10:41:08.957 に答える
0

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

また、選択できなかった組み込みのLLVM バグを開くことをお勧めします。Clang と LLVM には非常に活発なコミュニティがあり、誰かがすぐにバグを拾う可能性があります。

于 2014-01-24T16:34:26.927 に答える
0

多かれ少なかれ複雑な C++ コード (vtable にコンパイルするコードなど) の場合、答えは圧倒的に NO です。この 2 つは互換性がありません。

上記の点を説明するために、Crypto++ライブラリを g++ でコンパイルして (AES/GCM で約 40% 高速化)、clang++ でコンパイルしたコードをリンクしてみてください。

于 2014-01-23T03:00:30.037 に答える