Неопределенные символы для архитектуры x86_64: _g_object_unref

Я действительно новичок в make-файлах, а также в библиотеках или фреймворках, которые я использую (Gtk, Gdk и OpenCL), чтобы создать программу, которая должна отображать набор Мандельброта в виде динамического изображения.

Я создал этот make-файл на основе make-файла, предоставленного моим профессором. Проблема, с которой я столкнулся с его make-файлом, связана с тем, что мой профессор использовал другую операционную систему и т. д.

Итак, я изменил его make-файл на мой новый make-файл:

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 $@

%.o: %.c
    $(CC) $(CFLAGS) -c $*.c -o $@

opencl_mandelbrot: opencl_mandelbrot.o opencl_util.o
    $(CC) $(CFLAGS) $(LDFLAGS) opencl_mandelbrot.o opencl_util.o -framework OpenCL -o $@

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

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

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

хотя я установил gtk с помощью brew, но я предполагаю, что проблема связана с порядком компоновки или чем-то подобным...

Я ценю вашу помощь!


person nbro    schedule 17.05.2016    source источник


Ответы (3)


opencl_mandelbrot: opencl_mandelbrot.o opencl_util.o
    $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) opencl_mandelbrot.o opencl_util.o -framework OpenCL -o $@ 

Вы пропустили LIBS

person Stian Skjelstad    schedule 17.05.2016

Вы присваиваете флаги компоновщика GTK+ переменной LIBS, но в ваших правилах вы используете переменную LDFLAGS, так что вы получаете ошибки компоновщика, потому что компоновщик не может разрешать символы, так как ему не было указано искать их в местах боя.

Изменять:

LIBS=$(GTK_LIBS)

to

LDFLAGS=$(GTK_LIBS)

или добавьте $(LIBS) в свои правила компоновщика.

person el.pescado    schedule 17.05.2016

Пытаясь заново изобрести встроенные правила, вы в конечном итоге добавили свои собственные ошибки, вам не нужно говорить make, как компилировать или компоновать, он уже знает, все, что вам нужно сделать, это установить правильные переменные.

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)

Будьте осторожны при удалении файлов с использованием подстановочных знаков, если вы собираетесь распространять свой код, это плохая идея.

person user657267    schedule 17.05.2016