Правильно включать заголовки GLib с автоинструментами - PullRequest
0 голосов
/ 24 января 2012

В моей обычной среде разработки (ubuntu) у меня нет проблем с линковкой GLib-2.0, однако, когда я пытаюсь использовать новую установку Debian Squeeze, я сталкиваюсь с ошибками, связывающими GLib.

configure.ac:

...
AC_PROG_CC
AM_PROG_CC_C_O
CFLAGS="$CFLAGS -Wall -W -Wno-unused-parameter -std=c99 -pedantic"

PKG_CHECK_MODULES(MYAPP, [glib-2.0 >= 2.3.0  gthread-2.0])

LIBS="$LIBS $MYAPP_LIBS"

AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

Похоже, что Autotools передает правильные параметры gcc:

-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lgthread-2.0 -lglib-2.0

Однако при запуске make появляется ошибка компиляции: undefined reference to 'g_list_free_full'

Чтобы убедиться, что библиотеки действительно установлены:

$ dpkg --get-selections | grep glib
libglib2.0-0                    install
libglib2.0-data                 install
libglib2.0-dev                  install

Есть мысли?

1 Ответ

3 голосов
/ 24 января 2012

На что обратить внимание:

   stormfs_LDADD = $(LIBS) $(LIBGCRYPT_LIBS)
>> stormfs_LDFLAGS = $(STORMFS_LIBS)                                               

(см. флаги компоновщика в неправильном месте здесь, на SO.)
Это должно быть:

stormfs_LDADD = ${LIBS} ${LIBGCRYPT_LIBS} ${STORMFS_LIBS}

(Это, однако, избыточно, потому что и LIBS, и STORMFS_LIBS содержат одно и то же значение, так же как я смотрел на сгенерированный Makefile.)

Edit:

nm -D /usr/lib64/libglib-2.0.so | grep g_list_free_full
0000000000042740 T g_list_free_full

Таким образом, libglib.so (ваш путь к нему может отличаться) включает g_list_free_full как минимум в glib2-2.30.1. Согласно документации, эта функция доступна только после glib2-2.28, но ваша установка, вероятно, слишком устарела. Лучшее использование (и желательно только одна pkg-зависимость для каждой переменной, чтобы упростить обнаружение того, что именно из части [deps] не может быть найдено):

#configure.ac
PKG_CHECK_MODULES([libgthread], [gthread-2.0])
PKG_CHECK_MODULES([libglib], [glib-2.0 >= 2.28])
...