2012-07-18 63 views
14

我相信這不是一個重複的問題,我在發佈此問題之前已經看到所有問題/答案。我想我在這裏有不同的情況。在Ubuntu上編譯和鏈接GTK 3與C項目

我使用Ubuntu 12.04並下載了GTK 2和3。我從GNOME的網站上覆制了一個簡單的GTK源代碼。但是,當我在終端使用這個命令:

gcc `pkg-config --cflags --libs gtk+-3.0` hello.c -o hello 

我得到這個:

hello.c:(.text+0x17): undefined reference to `gtk_init' 
hello.c:(.text+0x23): undefined reference to `gtk_window_new' 
hello.c:(.text+0x47): undefined reference to `gtk_main_quit' 
hello.c:(.text+0x5b): undefined reference to `g_signal_connect_data' 
hello.c:(.text+0x67): undefined reference to `gtk_widget_show' 
hello.c:(.text+0x6c): undefined reference to `gtk_main' 

這裏是我的代碼:

#include <gtk/gtk.h> 

int 
main (int argc, 
char *argv[]) 
{ 
    GtkWidget *window; 

    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 

    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); 

    gtk_widget_show (window); 

    gtk_main(); 

    return 0; 
} 

我不知道,如果出現錯誤,因爲我有兩個版本的GTK +或者什麼。 我在Ubuntu/Linux的應用程序開發中非常新手。

+4

編譯如'的GCC的hello.c $(pkg配置--cflags --libs GTK + -3.0)-o hello'即庫之前源 – 2012-07-18 17:22:39

+0

哦,我的上帝,它的工作。非常感謝。你能否把下面的答案標記爲答案。 – Anwar 2012-07-18 17:24:24

回答

22

您應該將庫文件之前出現的源文件編譯爲gcc hello.c $(pkg-config --cflags --libs gtk+-3.0) -o hello,原因是鏈接器的行爲,即它不鏈接庫,除非該庫的符號在編譯之前出現。
希望這有助於!

+0

+1,正好!較新的GCC/binutils版本的奇怪和緊張的行爲。 – 2012-07-18 17:30:02

+4

@ H2CO3:是的,先生(/女士)!這也是相當受歡迎的問題了:) – 2012-07-18 17:31:38

-1

你也可以直接包括GTK庫到您的項目:

  1. 在Eclipse擴展:項目>屬性> C/C++編譯>設置>工具設置>跨GCC鏈接>圖書館
  2. 套裝:庫搜索路徑(-L)指向文件「libgtk-n.so」的路徑,其中n爲您的版本。在Lubuntu上安裝(apt-get install libgtk-3-dev)後,這是「/ usr/lib/x86_64-linux-gnu /」。
  3. 然後添加到庫(-1):GTK正