Fifth Browser - 如何让配置脚本识别依赖项?

Fifth Browser - 如何让配置脚本识别依赖项?

我正在尝试安装第五浏览器(网站) (github链接)在 Xubuntu 16.04.2 LTS 上。

我能够通过官方发行版存储库获取所有依赖项,并使用 Synaptic 进行安装。其中之一如 Fifth 主页上所列称为 liburlmatch (github链接)。它似乎是一个简单的库,可让您在使用通配符时阻止 URL。

我已经通过以下方式安装了 urlmatch:
/git clone https://github.com/clbr/urlmatch.git然后
/sudo checkinstall 在一个单独的文件夹中。这似乎完美无缺。

当我在第五个文件夹中执行 ./configure 时,最后几行如下所示:

checking for fltk-config13... no
checking for fltk-config... fltk-config
checking for url_init in -lurlmatch... no
configure: error: liburlmatch not found

为了方便起见,您可以在以下 Pastebin 中找到与 urlmatch 有关的配置文件部分:liburlmatch 配置中的代码块

我究竟做错了什么?为什么配置脚本无法识别 urlmatcher 库?请在您的回答中考虑这是我第一次尝试编译这样的程序,谢谢。

答案1

看起来问题实际上与 Fifth-5.0 的配置脚本如何构建和运行 urlmatch 库的 conftest 有关。

一、错误

checking for url_init in -lurlmatch... no
configure: error: liburlmatch not found

事实证明有些误导:如果我们查看,config.log我们会发现由于对函数的未定义引用,conftest 实际上无法构建uncompress

configure:5511: checking for url_init in -lurlmatch
configure:5546: g++ -o conftest -g -O2 -pthread  -isystem /usr/include/cairo -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /usr/include/pixman-1 -isystem /usr/include/freetype2 -isystem /usr/include/libpng12 -isystem /usr/include/freetype2 -isystem /usr/include/cairo -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /usr/include/pixman-1 -isystem /usr/include/freetype2 -isystem /usr/include/libpng12 -fvisibility-inlines-hidden  -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT   -lz conftest.cpp -lurlmatch    -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 >&5
//usr/local/lib/liburlmatch.a(opti_init.o): In function `initbin':
opti_init.c:(.text+0xd6): undefined reference to `uncompress'
collect2: error: ld returned 1 exit status
configure:5552: $? = 1

那是因为uncompressis in libz- 正在链接 liburlmatch

. . .   -lz conftest.cpp -lurlmatch -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 >&5

未能遵守两个库的必要链接顺序1 。我们可以进一步追溯到生成脚本configure.ac的文件:configure

# Checks for libraries.
OLD_LDFLAGS=[$LDFLAGS]
LDFLAGS=["$LDFLAGS -lz"]
AC_CHECK_LIB([urlmatch], [url_init], [], AC_MSG_ERROR([liburlmatch not found]))
LDFLAGS=[$OLD_LDFLAGS]

即不是被添加到列表中LIBS,而是-lz被添加到LDFLAGS(更通常用于指定附加库路径之前LIBS)。

一个快速而肮脏的解决方法是./configure使用显式LIBS参数进行调用:

./configure "LIBS=-lz"

这会导致在命令行-lz上放置额外的内容g++图书馆urlmatch(在另一个的头部LIBS):

. . . -lz conftest.cpp -lurlmatch -lz -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 >&5

更永久的解决方案可能是修改configure.ac文件以添加-lzLIBS而不是,然后使用LDFLAGS重新生成(或如果需要)。configureautoconfautoreconf


参考文献:

  1. 为什么 gcc 中“-l”选项的顺序很重要?

相关内容