Fifth Browser - как заставить скрипт configure распознать зависимость?

Я пытаюсь установить Fifth Browser (сайт) (ссылка на github) на Xubuntu 16.04.2 LTS.

Я смог получить все зависимости из официальных репозиториев дистрибутива, используя Synaptic для установки. Одна из них как указано на домашней странице пятой версии называется 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

Вы можете найти часть файла configure, относящуюся к urlmatch, в следующем pastebin для вашего удобства: codeblock из configure для liburlmatch.

Что я делаю не так? Почему скрипт configure не распознает библиотеку urlmatcher? Пожалуйста, учтите в своем ответе, что это моя первая попытка скомпилировать подобную программу, спасибо.

0
26.06.2017, 14:58
1 ответ

Похоже, проблема на самом деле связана с тем, как скрипт configure для пятой версии 5.0 создает и запускает conftest для библиотеки urlmatch.

Во-первых, ошибка

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

несколько вводит в заблуждение: если мы посмотрим на config.log, мы увидим, что conftest на самом деле не собирается из-за неопределенной ссылки на . ]uncompressfunction:

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

Это потому, что uncompressнаходится в 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чтобы добавить -lzв LIBSвместо LDFLAGS, а затем повторно сгенерировать configureс помощью autoconf(или autoreconfпри необходимости).


Ссылки:

  1. Почему порядок опции '-l' в gcc имеет значение?
1
28.01.2020, 02:45

Теги

Похожие вопросы