【问题标题】:Properly include GLib headers with autotools使用自动工具正确包含 GLib 标头
【发布时间】:2012-01-23 21:52:00
【问题描述】:

在我的正常开发环境 (ubuntu) 中,我在链接 GLib-2.0 时没有任何问题,但是当我尝试在全新安装的 Debian Squeeze 上进行构建时,我在链接 GLib 时遇到了错误。

配置.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

有什么想法吗?

【问题讨论】:

  • 您应该向我们展示您的 Makefile.am(如果使用 automake)或 Makefile.in(如果不是)。同时显示src/Makefile.amsrc/Makefile.in
  • 完整来源可以在这里找到:github.com/benlemasurier/stormfs 为了简洁起见,我从帖子中删除了一些数据
  • 不得在 configure.ac 中分配 CFLAGS。 CFLAGS 是一个用户变量,运行配置脚本的用户不应覆盖其对 CFLAGS 的分配。见gnu.org/software/automake/manual/html_node/User-Variables.html
  • curl/types.h 在2ef7a28a71 被删除。最好不要使用它。否则,Debian Squeeze 后将无法编译。
  • 只是古玩,谁在使用g_list_free_full

标签: autotools glib


【解决方案1】:

注意事项:

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

(请参阅此处的Linker flags in wrong place。)
那应该是:

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

(不过这有点多余,因为 LIBS 和 STORMFS_LIBS 包含相同的值,就像我查看生成的 Makefile 一样。)

编辑:

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

所以 libglib.so(您的路径可能会有所不同)至少在 glib2-2.30.1 中包含 g_list_free_full。根据文档,此功能仅在 glib2-2.28 之后可用,但您的安装可能太旧了。最佳用途(最好每个变量只有一个 pkg 依赖项,以方便检测 [deps] 部分的确切内容无法找到):

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

【讨论】:

  • 谢谢,src/Makefile.am 现在看起来像:gist.github.com/1666483 但是我仍然遇到同样的问题。
  • g_list_free_full 要求 >=2.28。
  • 谢谢!!你为我节省了很多时间
猜你喜欢
  • 2019-07-29
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2019-04-30
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
相关资源
最近更新 更多