27

llvm-gcc で静的ライブラリをビルドし、それを mingw gcc を使用してコンパイルされたプログラムとリンクすると、結果は機能しますか?

llvm-gcc、clang、および通常の gcc の他の組み合わせについても同じです。これが Linux (もちろん通常の非 mingw gcc を使用) やその他のプラットフォームでどのように機能するかに興味がありますが、重点は Windows にあります。

私はすべての言語にも興味がありますが、特に C と C++ に重点を置いています。明らかに、clang は Fortran などをサポートしていませんが、llvm-gcc はサポートしていると思います。

それらはすべて ELF ファイル形式を使用していると思いますが、呼び出し規則、仮想テーブル レイアウトなどはどうでしょうか。

4

5 に答える 5

23

はい、C コードの場合、Clang と GCC は互換性があります (実際、どちらもリンクに GNU ツールチェーンを使用します)。clang に中間ビットコード オブジェクトではなく、コンパイル済みオブジェクトを作成するように指示する必要があります。C ABI は明確に定義されているため、唯一の問題は保存形式です。

C++ はコンパイラ間で少しでも移植できません。異なるコンパイラは、異なる仮想テーブル呼び出し、コンストラクタ、破壊、名前マングリング、テンプレート実装などを使用します。原則として、ある C++ コンパイラのオブジェクトは別のコンパイラでは機能しないと想定する必要があります。

ただし、はい、執筆時点では、Clang++ は GCC/C++ コンパイル済みライブラリも使用できます。私は最近、G++ の標準ランタイム ライブラリを使用して clang で C++ プログラムをコンパイルするためのリグをセットアップしました。

于 2012-06-30T14:04:42.483 に答える
2

ldでclangの.oファイルをリンクするときに-mi386pepを使用します。llvmのgccとの統合への取り組みは、http://dragonegg.llvm.org/で公開されているため、llvmファミリーを推測するのは非常に直感的であり、gccツールチェーンとの相互互換性が非常に高くなります。

于 2013-03-04T12:31:32.610 に答える
2

答えはわかりませんが、このプレゼンテーションのスライド 10 は、llvmgcc によって生成された「.o」ファイルには、通常のターゲット固有のオブジェクト コードではなく、LLVM バイトコード (.bc) が含まれていることを暗示しているようです。可能です。ただし、LLVM リンカは、LLVM コードを「通常の」GCC によって生成されたコードにリンクできる必要があります。次のスライドで「ネイティブの .o ファイルとライブラリをここにリンクする」と述べています。

LLVM は Linux ツールです。Linux コンパイラが Windows では正しく動作しないことが時々あります。あなたがそれを機能させるかどうか、私は興味があります。

于 2010-07-16T21:44:43.307 に答える
1

申し訳ありませんが、休憩後にllvmに戻ってきましたが、チュートリアル以上のことをしたことはありません. 初めて、LLVM 2.6 を MinGW GCC 上に構築するのに苦労した後、私はちょっと燃え尽きました。ありがたいことに、LLVM 2.7 の問題ではありません。

今日もチュートリアルを進めていくと、チュートリアルの第 5 章で、LLVM がプラットフォームの ABI (アプリケーション バイナリ インターフェイス) を使用するという明確な記述だけでなく、チュートリアル コンパイラがこれに依存して、次のような外部関数へのアクセスを許可していることにも気付きました。 sinとcos。

ただし、互換性のある ABI が C++ に拡張されるかどうかはまだわかりません。これは、呼び出し規則の問題ではなく、名前のマングリング、構造体のレイアウト、および vtable のレイアウトです。

ほとんどの場合、C 関数呼び出しを行うことができれば十分ですが、C++ について気になる点がまだいくつかあります。

于 2010-07-10T21:47:21.253 に答える
-2

うまくいけば、彼らはそれを修正しましたが、私は(また)クロスコンパイラとしてllvmを使用し、64ビットマシンでllvm-gcc -m32を使用すると、-m32は無視され、64ビットintを取得するため、llvm-gccは避けます。 32ビットターゲットマシンで偽造されました。Clangにはそのバグもgccもありません。また、clangを使用すればするほど好きになります。あなたの直接の質問に関しては、知らないでください、理論的には、最近のターゲットはよく知られているか、使用されている呼び出し規約を持っています。そして、gccとllvmの両方が同じものに準拠していることを望みますが、決してわかりません。これを見つける最も簡単な方法は、いくつかの単純な関数を記述し、両方のツールセットを使用してコンパイルと逆アセンブルを行い、それらがどのようにオペランドを関数に渡すかを確認することです。

于 2010-07-11T04:22:00.977 に答える