2015-04-14 3 views
0

Я разрабатываю плагин xfce4, и я пытаюсь использовать Travis-CI. Я написал Makefile.am в моем корневом каталоге как так:Ошибка ссылки GTK2 на Travis-CI

SUBDIRS = src 
dist_doc_DATA = README.md 

Следовательно, в моем каталоге Src есть Makefile.am так:

bin_PROGRAMS = visualaudio 
visualaudio_SOURCES = visualaudio.c 
visualaudio_CFLAGS = $(GTK_CFLAGS) $(LIBXFCE4PANEL_CFLAGS) -W -Wall 
visualaudio_LDFLAGS = $(GTK_LIBS) $(LIBXFCE4PANEL_LIBS) 

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

xdt-autogen && make && make test 

Это приводит к следующему выполняющиеся:

Preparing package directory  /home/travis/build/alex/visualaudio... 
Running aclocal-1.11 -I /usr/share/xfce4/dev-tools/m4macros -I /usr/share/xfce4/dev-tools/m4macros... 
Running autoheader... 
Running automake-1.11 --force-missing --add-missing --copy --gnu... 
Running autoconf... 
Running /home/travis/build/alex/visualaudio/configure --enable-maintainer-mode ... 
checking for a BSD-compatible install... /usr/bin/install -c 
checking whether build environment is sane... yes 
checking for a thread-safe mkdir -p... /bin/mkdir -p 
checking for gawk... gawk 
checking whether make sets $(MAKE)... yes 
checking whether to enable maintainer-specific portions of Makefiles... yes 
checking for gcc... gcc 
checking whether the C compiler works... yes 
checking for C compiler default output file name... a.out 
checking for suffix of executables... 
checking whether we are cross compiling... no 
checking for suffix of object files... o 
checking whether we are using the GNU C compiler... yes 
checking whether gcc accepts -g... yes 
checking for gcc option to accept ISO C89... none needed 
checking for style of include used by make... GNU 
checking dependency style of gcc... gcc3 
checking for pkg-config... /usr/bin/pkg-config 
checking pkg-config is at least version 0.9.0... yes 
checking for gtk+-2.0 >= 2.6.0... 2.24.10 
checking GTK_CFLAGS... -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 
checking GTK_LIBS... -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 
checking for pkg-config... (cached) /usr/bin/pkg-config 
checking pkg-config is at least version 0.9.0... yes 
checking for libxfce4panel-1.0 >= 4.8.0... 4.8.6 
checking LIBXFCE4PANEL_CFLAGS... -pthread -I/usr/include/xfce4/libxfce4panel-1.0 -I/usr/include/gtk-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/xfce4 
checking LIBXFCE4PANEL_LIBS... -Wl,--export-dynamic -pthread -lxfce4panel-1.0 -lgtk-x11-2.0 -lgmodule-2.0 -lrt -lxfce4util -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 
configure: creating ./config.status 
config.status: creating Makefile 
config.status: creating src/Makefile 
config.status: creating config.h 
config.status: executing depfiles commands 
Now type "make" to compile. 
(CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash /home/travis/build/alex/visualaudio/missing --run autoheader) 
rm -f stamp-h1 
touch config.h.in 
cd . && /bin/bash ./config.status config.h 
config.status: creating config.h 
config.status: config.h is unchanged 
make all-recursive 
make[1]: Entering directory `/home/travis/build/alex/visualaudio' 
Making all in src 
make[2]: Entering directory `/home/travis/build/alex/visualaudio/src' 
gcc -DHAVE_CONFIG_H -I. -I.. -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -pthread -I/usr/include/xfce4/libxfce4panel-1.0 -I/usr/include/gtk-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/xfce4 -W -Wall -g -O2 -MT visualaudio-visualaudio.o -MD -MP -MF .deps/visualaudio-visualaudio.Tpo -c -o visualaudio-visualaudio.o `test -f 'visualaudio.c' ||  echo './'`visualaudio.c 
mv -f .deps/visualaudio-visualaudio.Tpo .deps/visualaudio-visualaudio.Po 
gcc -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -pthread -I/usr/include/xfce4/libxfce4panel-1.0 -I/usr/include/gtk-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/xfce4 -W -Wall -g -O2 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -Wl,--export-dynamic -pthread -lxfce4panel-1.0 -lgtk-x11-2.0 -lgmodule-2.0 -lrt -lxfce4util -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -o visualaudio visualaudio- visualaudio.o 
visualaudio-visualaudio.o: In function `on_window_destroy_event': 
/home/travis/build/alex/visualaudio/src/visualaudio.c:6: undefined reference to `gtk_main_quit' 
visualaudio-visualaudio.o: In function `main': 
/home/travis/build/alex/visualaudio/src/visualaudio.c:12: undefined reference to `gtk_init' 
/home/travis/build/alex/visualaudio/src/visualaudio.c:14: undefined reference to `gtk_window_new' 
/home/travis/build/alex/visualaudio/src/visualaudio.c:15: undefined reference to `gtk_widget_show' 
/home/travis/build/alex/visualaudio/src/visualaudio.c:17: undefined reference to `gtk_window_get_type' 
/home/travis/build/alex/visualaudio/src/visualaudio.c:17: undefined reference to `g_type_check_instance_cast' 
/home/travis/build/alex/visualaudio/src/visualaudio.c:17: undefined reference to `gtk_window_set_decorated' 
/home/travis/build/alex/visualaudio/src/visualaudio.c:20: undefined reference to `g_type_check_instance_cast' 
/home/travis/build/alex/visualaudio/src/visualaudio.c:20: undefined reference to `g_signal_connect_data' 
/home/travis/build/alex/visualaudio/src/visualaudio.c:22: undefined reference to `gtk_main' 
collect2: ld returned 1 exit status 
make[2]: *** [visualaudio] Error 1 
make[2]: Leaving directory `/home/travis/build/alex/visualaudio/src' 
make[1]: *** [all-recursive] Error 1 
make[1]: Leaving directory `/home/travis/build/alex/visualaudio' 
make: *** [all] Error 2 

Локально это удается без каких-либо предупреждений. Это с -W и -Wall. На Travis-CI кажется, что правильные библиотеки не связаны, хотя в команде gcc они, похоже, ссылаются на правильные библиотеки. В моей системе работает Debian Wheezy с версией gcc версии 4.7.2.

Редактировать: Просто сменил компилятор C на Travis-CI, чтобы быть Clang. Все скомпилировано и связано успешно. Я предполагаю, что это связано с новой версией GCC на Ubuntu по сравнению с Debian. Может, это порядок флагов?

+0

Да, порядок флагов неверен: проверьте http: // stackoverflow.com/questions/17124070/gtk-gcc-undefined-reference-to-all-gtk-functions-when-linking/17200947 для деталей. – ntd

ответ

2

Руководство Automake скрывает соответствующую информацию в своей свернутой структуре, но ... вы злоупотребляете LDFLAGS.

При внимательном чтении the section на AutoMake переменных, которые вы откроете для себя:

  • LIBADD должен содержать дополнительные объекты и LIBTOOL библиотеки (т.е. .la файлы), чтобы добавить к библиотеке;
  • LDADD должен содержать дополнительные объекты, библиотеку LIBTOOL и -l, -L, -dlopen и -dlpreopen флагов, чтобы добавить к программе;
  • LDFLAGS должно содержать все остальное.

Кроме того, вы должны отметить порядок объектов, библиотек, -l и -L флаги. Это не gcc зуд, но он продиктован c99 standard. И это, вероятно, означает, что clang построен успешно, потому что он не в режиме C99.

Я также подозреваю, libxfce4panel уже имеет зависимость от GTK + и если вы получили флаги через pkg-config (как это кажется вашим configure выход) вы можете просто использовать libxfce4panel только.

В конце концов, я думаю, что правильный Makefile.am может быть:

bin_PROGRAMS = visualaudio 
visualaudio_CFLAGS = $(LIBXFCE4PANEL_CFLAGS) 
visualaudio_LDADD = $(LIBXFCE4PANEL_LIBS) 

visualaudio.c в качестве исходного файла подразумевается. Дополнительные флаги должны быть добавлены снаружи через configure, а не в hardcoded в make-файл, например. в вашем .travis.yml вы можете использовать ./configure CFLAGS='-W -Wall'.

+0

Хороший ответ, хорошо написанный и хорошее объяснение. Особенно спасибо за ссылку на страницу руководства automake. Я постараюсь завтра, и если все это сработает - я надеюсь, что так будет, - я помету ваш ответ как правильный! – Alex

+0

Как и ожидалось, все сработало. Большое спасибо за помощь! – Alex

+0

@Alex Ваш прием. Я должен добавить, что я не уверен в своей последней теории, то есть если ** ** имеет зависимость от ** b **, вы можете просто использовать ** a **. Чем больше я думаю об этом, тем больше думаю, что это неправильно. – ntd

Смежные вопросы