В чем разница между lib и модулем с autoconf
Я должен проверить, что определенные библиотеки (libm, libdl) присутствуют, чтобы скомпилировать мою библиотеку.
В моем файле шаблона configure.ac есть PKG_CHECK_MODULES
макросы и PKG_CHECK_LIB
макросы.
Я не понимаю, какой использовать и как?
PKG_CHECK_MODULES
кажется наиболее глобальным, потому что он проверяет, присутствует ли целая библиотека и PKG_CHECK_LIB
проверяет только доступность одной функции... Но когда я делаю PKG_CHECK_MODULES([LIBM],[libm],[],[exit -1])
существует, и я не понимаю почему.
Я думаю, что я неправильно понимаю некоторые концепции. Может быть, кто-то может привести меня к хорошим ссылкам.
2 ответа
PKG_CHECK_MODULES
предназначен для интеграции с пакетами, имеющими метаданные pkg-config. Эти метаданные обычно хранятся в файле с именем foo.pc
(для пакета foo
) в каком-то месте вроде /usr/share/pkgconfig
, Этот файл скажет где foo
и связанные с ним файлы (файлы заголовков, библиотеки, исполняемые файлы, данные и т. д.) фактически установлены.
Однако большинство пакетов не используют pkg-config
система, включая стандартную библиотеку C, где libm
а также libdl
являются. Так что вам нужно проверить их, используя AC_CHECK_LIB
,
Вы, кажется, в замешательстве, поэтому я расскажу немного об этом:
Когда-то был X11; было много несовместимых установок X11. Чтобы написать код, который будет компилироваться для каждого варианта, люди писали бы сумасшедшие макросы autoconf, чтобы попытаться автоматически выяснить, какие библиотеки перечислить раньше, какие библиотеки перечислить после, и какие дополнительные флаги необходимы между ними. (увидеть AC_PATH_X
, AC_PATH_XTRA
).
Некоторые люди пробовали более разумные подходы и писали сценарии оболочки для установки вдоль библиотек; так что вы просто позвоните им, и они дадут вам все магические флаги, необходимые для этих конкретных библиотек. (увидеть sdl-config
, wx-config
, freetype-config
, motif-config
, так далее)
Тогда ребята из freedesktop.org решили, что каждый должен поддерживать те сценарии, которые делают одно и то же, поэтому они написали инструмент (pkg-config), который будет работать как все *-config
сценарии, и не требует запуска оболочки (yay для пользователей Windows). Все, что нужно сделать авторам библиотеки - это записать метаданные в *.pc
файлы, и установите их вдоль библиотек.
Что касается autoconf, у него есть низкоуровневые способы разбираться в системе, чтобы узнать о библиотеках: AC_CHECK_HEADERS
, чтобы увидеть, если заголовки присутствуют и могут быть использованы, и AC_CHECK_LIB
, чтобы увидеть, можно ли на них ссылаться.
Инструмент pkg-config поставляется с удобными макросами для autoconf, в основном PKG_CHECK_MODULES
, который вместо того, чтобы возиться, просто ищет метаданные, которые могла установить библиотека.
Что касается libm, libdl, как сказал ldav1s, они являются частью системы; некоторые системы нуждаются в явной связи с libm (который предоставляет математические функции) и / или libdl (который предоставляет функции для динамической загрузки общих объектов). Часто другие инструменты, такие как gcc или libtool, заботятся о связывании с ними. К сожалению, они не поставляются с метаданными для pkg-config, поэтому, если вам нужно найти их вручную, вам придется возиться со старым AC_CHECK_HEADERS
а также AC_CHECK_LIB
макросы, чтобы найти их.