我在编译 Glib 时遇到了一些问题。这些是我传递给的配置选项./configure
:
./configure LIBFFI_LIBS=/usr/local/lib/libffi.so.6 LIBFFI_CFLAGS=-I/usr/local/lib/libffi-3.0.11/include LIBFFI_CFLAGS=-L/usr/local/lib ZLIB_LIBS=/usr/local/lib/ ZLIB_CFLAGS=/usr/local/include/ CC=/usr/bin/gcc
这是我运行 make 命令时得到的错误
make[4]: Entering directory `/home/joe/Downloads/glib-2.32.4/gobject'
CCLD gobject-query
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_pointer'
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_float'
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_void'
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_sint64'
./.libs/libgobject-2.0.so: undefined reference to `ffi_prep_cif'
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_uint32'
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_double'
./.libs/libgobject-2.0.so: undefined reference to `ffi_call'
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_sint32'
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_uint64'
collect2: ld returned 1 exit status
make[4]: *** [gobject-query] Error 1
make[4]: Leaving directory `/home/joe/Downloads/glib-2.32.4/gobject'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/home/joe/Downloads/glib-2.32.4/gobject'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/home/joe/Downloads/glib-2.32.4/gobject'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/joe/Downloads/glib-2.32.4'
make: *** [all] Error 2
答案1
我知道这已经很老了,但我遇到了同样的问题。我的解决方法是,我没有进入 Makefile,而是进入并修改 Makefile.in 文件(我安装的 autotools 版本太低,无法自动重新配置,否则我会修改 Makefile.am 文件)。这些修改与 glib-2.34.1 tarball 相关。无论如何,修改如下:
gobject/Makefile.in: 第 629 行
progs_LDADD = ./libgobject-2.0.la $(libglib) $(LIBFFI_LIBS)
gobject/tests/Makefile.in: 第 461 行
LDADD = ../libgobject-2.0.la $(top_builddir)/gthread/libgthread-2.0.la $(top_builddir)/glib/libglib-2.0.la $(LIBFFI_LIBS)
gio/Makefile.in:我在许多 *_LDADD 定义(其中一些可能是不必要的)末尾添加了 $(LIBFFI_LIBS),这些定义位于以下几行:1292、1305(反斜杠之前)、1319、1327、1340
gio/tests/Makefile.in:第 1073 行(多行作业的一部分)
$(top_builddir)/gio/libgio-2.0.la $(LIBFFI_LIBS)
使用以下命令构建:
./configure --prefix=$APP/glib/2.34.1 --enable-man=no LIBFFI_CFLAGS=-I$APP/libffi/3.0.11/lib/libffi-3.0.11/include LIBFFI_LIBS=$APP/libffi/3.0.11/lib/libffi.la && make && make install
--enable-man=no 是由于我遇到的另一个错误,我并不担心无法访问与此相关的手册页。我实际上删除了之前构建/安装的版本,应用了这些修改并构建,它就正常工作了。
无论如何,我认为这些修改可能比修改 Makefile 中的相关行(尤其是 gio/tests/Makefile)花费的时间更少。它还可能为修改 autoconf 的 Makefile.am 文件提供一个起点。
答案2
您缺少以下开发文件(标头、库)库菲。
要安装它们,请安装libffi-devel
(RedHat 类型)或libffi-dev
(Debian 类型)包。
答案3
我让它工作了。
这需要对 glib 源目录中的每个 Makefile 进行破解,并添加指向 libffi.la 的绝对路径。我必须对产生此错误的每个 gcc 行执行此操作。有很多。
我会运行 make V=1 J=1 来找到下一行需要 libffi 函数的内容,然后修复它。似乎编写 makefiles / automake 配置脚本的人遗漏了这一部分...
这太糟糕了,我不知道如何追溯到这个问题的根源,以一种优雅的方式修复它,但这让它在不到一个小时的时间内恢复了工作。