llvm与外部库的链接

ekd*_*123 0 llvm

我现在在玩LLVM,它是JIT。我对JIT非常感兴趣,然后写了一个小GTK + hello世界:

#include <gtk/gtk.h>

int main ()
{
    gtk_init(NULL, NULL);
    GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect (win, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
    GtkWidget *lbl = gtk_label_new ("hello world");
    gtk_container_add (GTK_CONTAINER (win), lbl);
    gtk_widget_show_all (win);
    gtk_main();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我以这种方式将其编译为Bitcode:

clang -emit-llvm -S a.c `pkg-config --cflags gtk+-3.0`
llvm-link a.s -o a.o
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时

> lli a.o
LLVM ERROR: Program used external function 'gtk_init' which could not be resolved!
Run Code Online (Sandbox Code Playgroud)

我试图找出如何在链接时添加外部库,但没有发现任何问题。有没有办法让它运行?

Ant*_*kov 5

llvm-link不是一个“普通”链接器。它用于合并多个IR文件。因此,在您的情况下,ao只是二进制LLVM IR,并且一切正常,因为llvm-link自动解析了文本LLVM IR。

您不能“链接”本机库。但是,您可以将它们加载到lli进程中(例如,通过LD_PRELOAD),并且应该解析符号。