2015-10-27 2 views
1

Я пытаюсь создать простой пример gtk + в Eclipse.Building gtk + in eclipse

#include <gtk-2.0/gtk/gtk.h> 
#include <glib-2.0/glib.h> 

int main (int argc, char *argv[]) 
{ 
    /*-- Declare the GTK Widgets used in the program --*/ 
    GtkWidget *window; 

    /*-- Initialize GTK --*/ 
    gtk_init (&argc, &argv); 

    /*-- Create the new window --*/ 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

    /*-- Display the window --*/ 
    gtk_widget_show(window); 

    /*-- Start the GTK event loop --*/ 
    gtk_main(); 

    /*-- Return 0 if exit is successful --*/ 
    return 0; 
} 

Мой консольный вывод после того, как я строю проект ...

make all 
Building file: ../src/gtkTest.c 
Invoking: GCC C Compiler 
gcc -I/usr/local/include -O0 -g3 -Wall -c -fmessage-length=0 `pkg-config --cflags --libs gtk+-2.0` -MMD -MP -MF"src/gtkTest.d" -MT"src/gtkTest.d" -o "src/gtkTest.o" "../src/gtkTest.c" 
Finished building: ../src/gtkTest.c 

Building target: testParallel 
Invoking: GCC C Linker 
gcc `pkg-config --cflags --libs gtk+-2.0` -o "testParallel" ./src/gtkTest.o 
./src/gtkTest.o: In function `main': 
gtkTest.c:(.text+0x1e): undefined reference to `gtk_init' 
gtkTest.c:(.text+0x28): undefined reference to `gtk_window_new' 
gtkTest.c:(.text+0x38): undefined reference to `gtk_widget_show' 
gtkTest.c:(.text+0x3d): undefined reference to `gtk_main' 
collect2: error: ld returned 1 exit status 

Но если я скомпилировать его с помощью следующей команды в командной строке, он строит успешно.

gcc -o main ../src/gtkTest.c `pkg-config gtk+-2.0 --cflags --libs` 

В чем разница между двумя командами? И как я могу сделать это в Eclipse?

ответ

1

Разница заключается в том, что эта команда компиляции и компоновки:

gcc -o main ../src/gtkTest.c `pkg-config gtk+-2.0 --cflags --libs` 

правильно размещает необходимые библиотеки позже в последовательности связей, чем файл объекта (ов), которые требуют этих библиотек; в то время как эта команда ссылки:

gcc `pkg-config --cflags --libs gtk+-2.0` -o "testParallel" ./src/gtkTest.o 

неправильно размещает в библиотеках до того объектного файл, который нуждается в них. Изменить на:

gcc -o "testParallel" ./src/gtkTest.o `pkg-config --cflags --libs gtk+-2.0` 

объектов, которые хотят определения символов должны быть связаны, прежде чем объекты, которые обеспечивают определения. У вас есть симметрично противоположная проблема: this one

+0

Так лучше ли разделять 'cflags' и' libs', так как нам нужно включить для создания объектных файлов? – harsh

+0

gcc 'pkg-config --cflags gtk + -2.0' -o" testParallel "./src/gtkTest.o' pkg-config -libs gtk + -2.0'. Что-то вроде этого? – harsh

+0

Да, в Eclipse-CDT, я думаю, вам нужно будет различать связь, например. Поместить 'pkg-config -libs-only-L gtk + -2.0' в ** Разное ** -> ** Флаги компоновщика ** и поместить библиотеки, сообщенные' pkg-config -libs-only-l gtk + - 2.0 ** в ** Библиотеки **. Во всяком случае, это вопрос о том, чтобы быть более разборчивым в отношении каких 'pkg-config ...' вызовов, которые вы используете в тех местах. 'man pkg-config', конечно. –