2016-05-17 19 views
1

Ich bin wirklich neu in Makefiles und auch in den Bibliotheken oder Frameworks, die ich verwende (Gtk, Gdk und OpenCL), um ein Programm zu erstellen, das das Mandelbrot als dynamisch anzeigen soll Bild.Nicht definierte Symbole für Architektur x86_64: "_g_object_unref"

Ich habe diese make-Datei basierend auf einem Makefile erstellt von meinem Professor erstellt. Das Problem, das ich war mit seinem Make-Datei, die auf die Tatsache zurückzuführen ist, dass mein Professor ein anderes Betriebssystem wurde mit etc.

Also, ich habe seine Make-Datei zu dieser meiner neuen Make-Datei geändert:

GTK_PACKAGES=gdk-pixbuf-2.0 gtk+-2.0 
GTK_CFLAGS=$(shell pkg-config --cflags $(GTK_PACKAGES)) 
GTK_LIBS=$(shell pkg-config --libs $(GTK_PACKAGES)) 

CFLAGS=-g -Wall -O2 -std=c99 $(GTK_CFLAGS) 
LIBS=$(GTK_LIBS) 

PROGS=opencl_mandelbrot 

.PHONY: all 
all: $(PROGS) 

%: %.c 
    $(CC) $(CFLAGS) $(LDFLAGS) $*.c -framework OpenCL -o [email protected] 

%.o: %.c 
    $(CC) $(CFLAGS) -c $*.c -o [email protected] 

opencl_mandelbrot: opencl_mandelbrot.o opencl_util.o 
    $(CC) $(CFLAGS) $(LDFLAGS) opencl_mandelbrot.o opencl_util.o -framework OpenCL -o [email protected] 

.PHONY: clean 
clean: 
    rm -f *.o $(PROGS) 

Aber wenn ich versuche, make auf dem Terminal eingeben, habe ich folgende Fehlermeldung:

cc -g -Wall -O2 -std=c99 -D_REENTRANT -I/opt/X11/include/cairo -I/opt/X11/include/pixman-1 -I/opt/X11/include -I/opt/X11/include/freetype2 -I/opt/X11/include/libpng15 -I/opt/X11/include -I/usr/local/Cellar/gdk-pixbuf/2.32.3/include/gdk-pixbuf-2.0 -I/usr/local/Cellar/gtk+/2.24.30/include/gtk-2.0 -I/usr/local/Cellar/gtk+/2.24.30/lib/gtk-2.0/include -I/usr/local/Cellar/pango/1.38.1/include/pango-1.0 -I/usr/local/Cellar/harfbuzz/1.2.6/include/harfbuzz -I/usr/local/Cellar/pango/1.38.1/include/pango-1.0 -I/usr/local/Cellar/atk/2.18.0_1/include/atk-1.0 -I/usr/local/Cellar/libpng/1.6.21/include/libpng16 -I/usr/local/Cellar/glib/2.46.2/include/glib-2.0 -I/usr/local/Cellar/glib/2.46.2/lib/glib-2.0/include -I/usr/local/opt/gettext/include -c opencl_mandelbrot.c -o opencl_mandelbrot.o 
cc -g -Wall -O2 -std=c99 -D_REENTRANT -I/opt/X11/include/cairo -I/opt/X11/include/pixman-1 -I/opt/X11/include -I/opt/X11/include/freetype2 -I/opt/X11/include/libpng15 -I/opt/X11/include -I/usr/local/Cellar/gdk-pixbuf/2.32.3/include/gdk-pixbuf-2.0 -I/usr/local/Cellar/gtk+/2.24.30/include/gtk-2.0 -I/usr/local/Cellar/gtk+/2.24.30/lib/gtk-2.0/include -I/usr/local/Cellar/pango/1.38.1/include/pango-1.0 -I/usr/local/Cellar/harfbuzz/1.2.6/include/harfbuzz -I/usr/local/Cellar/pango/1.38.1/include/pango-1.0 -I/usr/local/Cellar/atk/2.18.0_1/include/atk-1.0 -I/usr/local/Cellar/libpng/1.6.21/include/libpng16 -I/usr/local/Cellar/glib/2.46.2/include/glib-2.0 -I/usr/local/Cellar/glib/2.46.2/lib/glib-2.0/include -I/usr/local/opt/gettext/include opencl_mandelbrot.o opencl_util.o -framework OpenCL -o opencl_mandelbrot 
Undefined symbols for architecture x86_64: 
    "_g_object_unref", referenced from: 
     _reallocate_pixbufs in opencl_mandelbrot.o 
    "_g_type_check_instance_cast", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gdk_draw_pixbuf", referenced from: 
     _draw_mandelbrot_full_with_gpu in opencl_mandelbrot.o 
    "_gdk_pixbuf_get_height", referenced from: 
     _reallocate_pixbufs in opencl_mandelbrot.o 
     _recenter in opencl_mandelbrot.o 
     _draw_mandelbrot_full_with_gpu in opencl_mandelbrot.o 
    "_gdk_pixbuf_get_n_channels", referenced from: 
     _draw_mandelbrot_full_with_gpu in opencl_mandelbrot.o 
    "_gdk_pixbuf_get_pixels", referenced from: 
     _draw_mandelbrot_full_with_gpu in opencl_mandelbrot.o 
    "_gdk_pixbuf_get_rowstride", referenced from: 
     _reallocate_pixbufs in opencl_mandelbrot.o 
     _draw_mandelbrot_full_with_gpu in opencl_mandelbrot.o 
    "_gdk_pixbuf_get_width", referenced from: 
     _reallocate_pixbufs in opencl_mandelbrot.o 
     _recenter in opencl_mandelbrot.o 
     _draw_mandelbrot_full_with_gpu in opencl_mandelbrot.o 
    "_gdk_pixbuf_new", referenced from: 
     _reallocate_pixbufs in opencl_mandelbrot.o 
    "_gtk_init", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gtk_main", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gtk_main_quit", referenced from: 
     _destroy_window in opencl_mandelbrot.o 
     _keyboard_input in opencl_mandelbrot.o 
    "_gtk_object_get_type", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gtk_signal_connect_full", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gtk_widget_set_events", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gtk_widget_show_all", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gtk_window_get_type", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gtk_window_new", referenced from: 
     _main in opencl_mandelbrot.o 
    "_gtk_window_resize", referenced from: 
     _main in opencl_mandelbrot.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [opencl_mandelbrot] Error 1 

obwohl ich gtk mit brew installiert habe, aber ich denke, das Problem auf die Reihenfolge der Verknüpfung oder etwas ähnliches verwendet ist. ..

Ich schätze Ihre Hilfe!

Antwort

1
opencl_mandelbrot: opencl_mandelbrot.o opencl_util.o 
    $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) opencl_mandelbrot.o opencl_util.o -framework OpenCL -o [email protected] 

Sie verfehlten LIBS

1

Sie GTK + Linker zuweisen Flags LIBS Variable, aber in Ihrem Regeln verwenden Sie LDFLAGS Variable, so dass Sie Linker Fehler erhalten, weil Linker nicht Symbole lösen können, da sie nicht angewiesen wurde, in Kampfstätten nach ihnen zu suchen.

Wechsel:

LIBS=$(GTK_LIBS) 

zu

LDFLAGS=$(GTK_LIBS) 

oder fügen Sie $(LIBS) zu Ihren Linker-Regeln.

1

Durch den Versuch, die integrierten Regeln neu zu erfinden, die Sie am Ende Ihre eigenen Fehler hinzugefügt haben, müssen Sie make nicht sagen, wie man kompiliert oder verbindet, es weiß bereits, alles, was Sie tun müssen, ist das Setzen rechte Variablen.

GTK_PACKAGES := gdk-pixbuf-2.0 gtk+-2.0 
GTK_CFLAGS := $(shell pkg-config --cflags $(GTK_PACKAGES)) 
GTK_LIBS  := $(shell pkg-config --libs $(GTK_PACKAGES)) 

CFLAGS  := -g -Wall -O2 -std=c99 $(GTK_CFLAGS) 
LDLIBS  := $(GTK_LIBS) 

PROGS := opencl_mandelbrot 

.PHONY: all clean 

all: $(PROGS) 

opencl_mandelbrot: LDFLAGS += -framework OpenCL 
opencl_mandelbrot: opencl_mandelbrot.o opencl_util.o 

clean: ; $(RM) *.o $(PROGS) 

Pass auf, wenn Dateien mit Wildcards zu löschen, wenn Sie Ihren Code zu gehst Neuverteilung es ist eine schlechte Idee.

Verwandte Themen