2012-10-02 56 views
0

我現在在玩LLVM,它是JIT。我在JIT相當感興趣,然後我寫了一個小的GTK +的Hello World:llvm-link與外部庫

#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; 
} 

我編譯成位碼是這樣的:

clang -emit-llvm -S a.c `pkg-config --cflags gtk+-3.0` 
llvm-link a.s -o a.o 

但是當我運行它

> lli a.o 
LLVM ERROR: Program used external function 'gtk_init' which could not be resolved! 

我試圖找出如何在鏈接時添加外部庫,但我什麼也沒找到。有沒有辦法讓它運行?

回答

4

llvm-link不是一個「常用」鏈接器。它用於合併多個IR文件。所以,在你的情況下,a.o只是一個二進制LLVM IR,並且一切正常,因爲llvm-link自動分析了文本LLVM IR。

你不能「鏈接」本地庫。雖然,您可以將它們加載到lli進程中(例如,通過LD_PRELOAD),並且符號應該被解析。

+0

是的,它確實有效!非常感謝! – ekd123

+0

如果你有自己的庫函數,那麼你如何使用LD_PRELOAD,也就是說,他們沒有在其他地方定義過? – MetallicPriest