这是我的第一个Stackoverflow问题 :-)
我的背景:
- 2年Python经验
- 2个月的crystal-lang经验(使用Amber框架运行网站)
- 1个月的C、C++、汇编语言学习
事实: - crystal-lang在x86_64上编译和运行没有任何问题
请友善一些,因为我对低级语言的了解还不够。
据我理解,当我们使用LLVM编译和运行一个基本的hello.c文件时,它的过程如下:
hello.c:
#include
int main() {
printf("hello world\n");
return 0;
}
shell :
$ clang -O3 -emit-llvm hello.c -c -o hello.bc
$ llc hello.bc -o hello.s
$ gcc hello.s -o hello.native
$ ./hello.native
这是来自LLVM示例的内容)
我的观点是,我们可以生成一个相当简短的hello.bc文件(128行),并以较慢的方式运行:
$ lli hello.bc
但是当我尝试从hello.cr文件生成类似的hello.bc文件并像我对hello.c文件所做的那样运行它时:
hello.cr:
puts "hello world"
shell :
$ crystal build hello.cr --emit llvm-bc --release
$ llc hello.bc -o hello.s
我注意到以下问题:
- 这个 hello.bc 文件比从 c 文件生成的要大得多(43,624行)
无法使用 "lli" 运行此 hello.bc,因为它会生成以下错误:
"LLVM ERROR: Program used external function 'pcre_malloc' which could not be resolved!
即使我尝试使用 hello.s 生成 hello.native 文件也遇到相同的问题
- 如果我尝试使用 generate 和 hello.ll 文件,也会出现相同的问题
据我理解,LLVM是可移植的,并且所有前端语言都会产生一个中间文件 *.bc,然后可以编译成任何架构。
我的问题是:
- 为什么两种情况下的 hello.bc 不相似?
- 我在 crystal 过程中做错了什么吗?
谢谢!
-load
选项)。 - Johannes Müller