10

Ubuntu 64ビットで取得しました

llc --version
LLVM (http://llvm.org/):
  LLVM version 3.1
  Optimized build with assertions.
  Built Oct 15 2012 (18:15:59).
  Default target: x86_64-pc-linux-gnu
  Host CPU: btver1

  Registered Targets:
    arm      - ARM
    mips     - Mips
    mips64   - Mips64 [experimental]
    mips64el - Mips64el [experimental]
    mipsel   - Mipsel
    thumb    - Thumb
    x86      - 32-bit X86: Pentium-Pro and above
    x86-64   - 64-bit X86: EM64T and AMD64

私はこれを行うことはできません

clang -march=arm -x c++ /tmp/cpp.cpp 
error: unknown target CPU 'arm'

ここで何か足りないのですか?ARM 用にコンパイルできないのはなぜですか?

4

6 に答える 6

9

-march は LLVM の内部ツール コマンド ライン オプションであり、clang とはまったく接続されていません。他のターゲット用にコンパイルする必要がある場合は、ターゲットのトリプレットを指定する必要があります。これはいくつかの方法で実行できます (3.1 で動作するかどうかは覚えていませんが、3.2 で動作することは間違いありません)。

  • clang から your-target-triple-clang へ、例えば arm-none-linux-gnueabi-clang へのリンクを作成し、それを介してすべてをコンパイルします。
  • -targetオプションを提供します。clang -target arm-none-linux-gnueabi
于 2012-12-19T17:26:38.073 に答える
7

clangコンパイラのオプションのリストを取得するには、次を使用します。

clang -cc1 -help

ターゲットを指定するには、次を使用します-triple

clang -cc1-triple"arm-vendor-os"ファイル名

ここで、「vendor」と「os」は実際のベンダーとOS名に置き換える必要があります。に置き換えることもできますunknown

-tripleARCHITECTURE-VENDOR-OSまたはの形式の文字列ですARCHITECTURE-VENDOR-OS-ENVIRONMENT。例えば:x86_64-apple-darwin10

于 2012-12-19T02:29:53.353 に答える
6

ターゲットの 1 つにすぎないホストの llvm リンカー リンクは、リスト内のすべてのターゲットにリンクしません。それは間違いなくあらゆるターゲットに対してコンパイルされます。基本的に、clang は C/C++ からバイトコードに移行し、llc はバイトコードを取得して特定のターゲットのアセンブリを作成します (バイトコードを直接オブジェクト ファイルに取得するための新しい実験的オプション)。最終マイル (gnu binutils を使用)。残念ながら、バイトコードへのclangは完全に汎用的ではないことがわかりました(そうなると期待していました)。実際には、ターゲットに基づいてターゲットの独立した出力を変更します。-march を使用する代わりにホスト トリプルを使用する以下の例では、私の例をより多くのホストで適切にビルドすることができました。

ARMGNU?=arm-none-eabi
LOPS = -Wall -m32 -emit-llvm -ccc-host-triple $(ARMGNU)
OOPS = -std-compile-opts
LLCOPS = -march=thumb -mtriple=$(ARMGNU)

    clang $(LOPS) -c blinker03.c -o blinker03.clang.bc
    opt $(OOPS) blinker03.clang.bc -o blinker03.clang.thumb.opt.bc
    llc $(LLCOPS) blinker03.clang.thumb.opt.bc -o blinker03.clang.thumb.opt.s
    $(ARMGNU)-as blinker03.clang.thumb.opt.s -o blinker03.clang.thumb.opt.o
    $(ARMGNU)-ld -o blinker03.clang.thumb.opt.elf -T memmap vectors.o blinker03.clang.thumb.opt.o

まだ行っていませんが、近いうちにllcをオブジェクトに直接使用して実験します(実際、簡単なテストで試しましたが、より大きなものでは使用したり、どこにも投稿したりしていません)。

于 2012-12-19T02:15:18.313 に答える
2

フラグを混乱させています。clang-march=はプロセッサ ファミリを必要としています。おそらくclang -arch arm代わりに使用するつもりでした。

于 2012-12-19T01:51:49.733 に答える
2

このコメントはこのオプションを示しているため、現時点では Linux ではまだサポートされていません。

于 2012-12-22T06:41:22.900 に答える
0

「-arch arm」は、clang の「-arch armv4t」と同等です。「armv6」、「thumbv7」、「armv4t」など、より正確なものが必要な「-march =」では、一般的な「アーム」ターゲットは許可されていないと思います

特定のサブアーキテクチャを選択してみてください。

于 2013-09-29T09:40:41.580 に答える