Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LLVM:如何交叉编译C++;程序 我尝试使用LLVM编译C++源代码来武装二进制文件。下面是一个例子: //hello.cpp #include <iostream> int main() { std::cout << "Hello World!\n" << std::endl; return 0; }_C++_Llvm_Cross Compiling_Clang++_Libstdc++ - Fatal编程技术网

LLVM:如何交叉编译C++;程序 我尝试使用LLVM编译C++源代码来武装二进制文件。下面是一个例子: //hello.cpp #include <iostream> int main() { std::cout << "Hello World!\n" << std::endl; return 0; }

LLVM:如何交叉编译C++;程序 我尝试使用LLVM编译C++源代码来武装二进制文件。下面是一个例子: //hello.cpp #include <iostream> int main() { std::cout << "Hello World!\n" << std::endl; return 0; },c++,llvm,cross-compiling,clang++,libstdc++,C++,Llvm,Cross Compiling,Clang++,Libstdc++,到目前为止没有任何警告或错误。然后,我尝试使用qemu arm和gem5模拟器运行“hello.exe”,两者都因分段错误而崩溃: qemu arm的输出: qemu-arm hello.exe qemu: uncaught target signal 11 (Segmentation fault) - core dumped Segmentation fault (core dumped) 输出表格gem5: ~/gem5/build/ARM/gem5.opt ~/gem5/configs/

到目前为止没有任何警告或错误。然后,我尝试使用qemu arm和gem5模拟器运行“hello.exe”,两者都因分段错误而崩溃:

qemu arm的输出:

qemu-arm hello.exe
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault (core dumped)
输出表格gem5:

~/gem5/build/ARM/gem5.opt ~/gem5/configs/example/se.py -c ./hello.exe
**** REAL SIMULATION ****
info: Entering event queue @ 0.  Starting simulation...
panic: Page table fault when accessing virtual address 0xfffffff4
@ tick 2035000
[invoke:build/ARM/sim/faults.cc, line 70]
Memory Usage: 646432 KBytes
Program aborted at cycle 2035000
Aborted (core dumped)

我使用的是clang版本3.7.0svn。我遗漏了什么吗?事实上,编译过程用于几个c程序,它们都工作正常。但不是C++程序。

这样做是行不通的。事实上,LLVM IR不是目标中立的,因此将x86 IR编译到ARM将不起作用:ABI是不同的,等等


您需要使用clang的-target选项(或者将clang构建为指定默认目标的交叉编译器)。

谢谢大家的帮助。我刚刚想好了它的工作原理:

clang++ -target arm-none-linux-gnueabi --sysroot=/usr/local/arm-2009q3 -static hello.cpp -emit-llvm -c -I /usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/
llc hello.bc
arm-none-linux-gnueabi-g++ -static hello.s -o hello.exe
arm二进制文件在qemu arm和gem5上都正常运行

我认为LLVM IR应该完全独立于目标机器,但事实上它不是(奇怪的…)


我仍然不明白为什么c程序没有这个问题

你的构建和执行环境有兼容的C++库吗?@ CalnRuun:是的,如果C++库不兼容,分割错误就会发生。我使用的是预编译ARM交叉编译器,我确信它有自己的C++ LIBS。但如何检查它是否兼容?或者我可以使用命令行选项强制LLVM后端使用某些C++ LIBS吗?非常感谢您的帮助:)也许您应该使用与编译器匹配的链接器进行链接(即,仅当您使用
g++
编译时,才使用
g++
进行链接)。谢谢您的回复。我现在正在阅读关于如何使用-target选项进行交叉编译的llvm文档。顺便说一句,我不明白为什么上面的方法在c程序上没有问题?对于c你很幸运。例如,我相信如果您尝试按值传递/返回struct,或者在成员之间有间隙的struct,那么您将看到差异。毕竟,ARM是32位的,很可能是为x86-64编译的:)
clang++ -target arm-none-linux-gnueabi --sysroot=/usr/local/arm-2009q3 -static hello.cpp -emit-llvm -c -I /usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/
llc hello.bc
arm-none-linux-gnueabi-g++ -static hello.s -o hello.exe