在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编译?
答案 0 :(得分:5)
主机的llvm链接器链接,它只是目标之一,它不会链接到列表中的每个目标。它肯定会为任何目标编译。基本上clang从C / C ++转到字节码,然后llc接受字节码并为特定目标进行汇编(新的实验选项将字节码直接转换为目标文件)然后你需要得到一个交叉汇编器和一个交叉链接器来接受它最后一英里(我使用gnu binutils)。不幸的是,我发现clang到字节码并不是完全通用的(我曾希望并期望它会),它实际上确实改变了基于目标的目标独立输出。以下示例使用host triple而不是using -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
我没有,但不久之后会尝试直接使用这个对象(实际上我是在一个简单的测试中尝试过它但是没有在任何更大的地方使用它或在任何地方发布它。)
答案 1 :(得分:4)
使用
获取clang编译器的选项列表clang -cc1 -help
要指定目标,请使用-triple
clang -cc1 -triple“arm-vendor-os”filename
其中“vendor”和“os”应替换为实际的供应商和操作系统名称。它也可以替换为unknown
。 triple
是ARCHITECTURE-VENDOR-OS
或ARCHITECTRUE-VENDOR-OS-ENVIRONMENT
形式的字符串,例如:x86_64-apple-darwin10
答案 2 :(得分:4)
-march是LLVM的内部工具命令行选项,根本不与clang连接。如果需要编译其他目标,则需要指定目标三元组。这可以通过几种方式完成(我不记得,它们是否适用于3.1,但它们肯定适用于3.2):
-target
选项,例如clang -target arm-none-linux-gnueabi
答案 3 :(得分:1)
-march=
想要一个处理器系列。您可能打算使用clang -arch arm
代替。
答案 4 :(得分:1)
由于this comment说这个选项,目前在linux下还不支持。
答案 5 :(得分:0)
“ - arch arm”相当于clang中的“-arch armv4t”。我认为“-march =”不允许使用通用的“arm”目标,这应该需要更精确的东西,例如“armv6”,“thumbv7”,“armv4t”,......
尝试选择特定的子搜索。