Использование библиотеки с разными именами в пределах autoconf - PullRequest
1 голос
/ 06 декабря 2010

Я пытаюсь создать приложение с зависимостью OpenSync 0.4 (действительно 0.3.9).

В файле configure.ac проекта библиотека opensync записывается как libopensync1. Тем не менее, это не основано на моей системе Gentoo. Изменение libopensync1 на libopensync устраняет проблему для меня.

Я искал в Google и обнаружил, что libopensync1 используется в некоторых дистрибутивах, а libopensync в других. Так как решить эту проблему в configure.ac?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 08 декабря 2010

Макрос AC_SEARCH_LIBS делает то, что вам нужно.(Существует много горячих споров о том, следует ли когда-либо использовать pkg-config. Если вы решите положиться на него, ptomato предлагает разумный подход.) Просто добавьте это в ваш configure.ac:

AC_SEARCH_LIBS([osync_mapping_new],[opensync1 opensync],[],
  [AC_MSG_ERROR([can't find opensync])])

Сначала будет искать библиотеку с именем opensync1;если он этого не обнаружит, он будет искать opensync.

Основной недостаток использования pkg-config состоит в том, что большинство проектов, которые полагаются на него, на самом деле не проверяют, являются ли данные, предоставленные файлом .pc,надежный, поэтому настройка может быть успешной, но последующая сборка не удастся.Пользователь всегда может установить PKG_CONFIG = true при запуске configure и полностью удалить все данные, предоставленные любыми связанными файлами .pc, установив LIBS, CFLAGS и т. Д. Вручную «старомодным» способом.

Основной недостаток неиспользования pkg-config заключается в том, что пользователь должен устанавливать LIBS, CFLAGS и т. Д. Старомодным способом.На практике это довольно тривиально, и все, что сделал pkg-config, это переместил данные из одного файла CONFIG_SITE в отдельно поддерживаемые файлы .pc для каждого пакета.

Если вы используете PKG_MODULE_CHECK, выполните это с помощьювызов AC_CHECK_LIB или AC_SEARCH_LIBS для проверки данных в любом файле .pc, найденном PKG_CHECK_MODULES

2 голосов
/ 07 декабря 2010

Я предполагаю, что место, в котором это происходит внутри вашего configure.ac, находится внутри PKG_CHECK_MODULES вызова.

Глядя на источники libopensync, кажется, что libopensync1 - более новое имя, а libopensync - старое имя. Итак, мы будем использовать макросы pkg-config для поиска более нового имени , если оно не существует.

Поместите это в ваш configure.ac:

# Check if libopensync1 is known to pkg-config, and if not, look for libopensync instead
PKG_CHECK_EXISTS([libopensync1], [OPENSYNC=libopensync1], [OPENSYNC=libopensync])

Затем в вашем звонке PKG_CHECK_MODULES замените libopensync1 на $OPENSYNC.

...