2012-07-18 61 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正