1

主文件

import std.stdio;

void    main()
{
    writeln("Hello World !!!");
}

当我编译并执行它时,它工作得很好

但是当我尝试

ldc2 -output-ll main.d
lli main.ll

LLVM ERROR: Program used external function '_d_throw_exception' which could not be resolved!

我尝试在c

#include<stdio.h>

void    main()
{
  printf("Hello World !!!");
}

clang -S -emit-llvm foo.c

lli foo.ll

这是工作!

为什么在我编译宽度 ldc 时在 Dlang 中不起作用???

4

4 回答 4

1
    ldc2 -output-ll -betterC main.d

    lli -load /usr/lib/libphobos2-ldc.so.72 main.ll

    ./main

输出 -> Hello World !!!

这是因为

我需要禁用所有需要运行时的功能

http://forum.dlang.org/post/pqujluaxxmtfnoofqkje@forum.dlang.org 谢谢大家和大卫纳德林格

于 2017-06-15T16:11:16.680 回答
0
 lli -load /usr/lib/libdruntime-ldc-debug.so.72 -load /usr/lib/libphobos2-ldc-debug.so.72 main.ll

我有

LLVM 错误:程序使用了无法解析的外部函数“__start___minfo”!

于 2017-06-15T14:57:56.367 回答
0

因为cruntime对lli可用。而运行时不是。如果您要将 druntime 和 phobos 链接到 lli 或在启动时加载它,它将起作用。

于 2017-06-14T16:51:32.907 回答
0

LLVM 错误:程序使用了无法解析的外部函数“_d_throw_exception”!

您需要找出哪个动态库具有此符号,并使用lli -load /path/to/your/library.{so,dylib} ... foo.ll.

我不是 D 开发人员,所以我不需要你需要什么库。要查找库,请查看 Dlang 发行版的库。正如 Stefan K 所说,您可能需要一个负责 D 运行时的库。


一般来说,如果你缺少任何符号,在 Linux 系统上你可以使用

readelf --syms somelib.so

或者

objdump --dynamic-syms somelib.so

基于此命令,您可以编写一个例程,该例程find将遍历文件夹,其中包含您怀疑缺少符号的库,例如:

find path-to-dlang-libs-folder -type f ! -name "*.so" -exec objcdump --dynamic-libs -- {} + | grep _start___minfo

不过,您可能需要调整此命令才能在 Linux 上工作。

于 2017-06-14T17:21:41.140 回答