2009-09-03 4 views
6

В качестве последующего вопроса для моего last one существует ли какой-либо простой способ узнать, установлена ​​ли данная библиотека C на данной машине (а не программно, как раз некоторая вещь)? Мне нужно использовать libuuid, но я не уверен, что он установлен на рассматриваемых машинах. Единственные два способа я могу думать о том, являются:Определите, установлена ​​ли библиотека C в Unix

1) Попробуйте скомпилировать код там (больше работы, чем я хотел бы сделать)

2) Попробуйте что-то вроде «человек libuuid», хотя кажется, что это не всегда будет надежным, если по какой-то причине сборники не будут установлены.

Есть ли еще лучший способ?

ответ

9

Считаете ли вы использование autoconf? Он предназначен для проверки правильности настройки среды сборки.

+0

Не совсем знакомы с ним вообще, и, глядя на аргументы команды, я не совсем уверен, как это помогает мне решить мою проблему. Дополнительная информация, безусловно, была бы оценена. – Morinar

+0

Посмотрите документацию, с которой я связан. Ваша проблема - основной вариант использования для 'autoconf'. 'autoconf' возьмет файл' configure.ac' и выведет скрипт оболочки 'configure'. –

+0

@Morinar - Использование autoconf и automake не являются интуитивными и неясными в первую очередь, и вам может показаться, что вы ударяете головой о стену и/или записываете свой собственный инструмент автоматической настройки, но через некоторое время вы выясните, как они работают , Как человек, который совсем недавно должен был пройти этот процесс, я заверяю вас, что это лучший способ сделать это. –

0

Autotools, как уже упоминалось, проверяет символы внутри библиотек. То, как это делается, несколько просто. Как вы отметили в 1), autoconf и его результат скрипт configure, в основном создает фиктивную программу c и пытается связать с рассматриваемой библиотекой. Если это работает, библиотека работает, если она терпит неудачу, очевидно, что это не сработает. Autoconf ищет конкретные имена символов/функций в библиотеке.

+0

Что делает autoconf разумным: вы не просто ищете конкретный (библиотечный) файл - вы ищете определенную функцию, которая обычно находится в этой библиотеке. Любой может создать библиотеку libuuid.so (libuuid.a); если библиотека не содержит функцию, которую вы ищете, эта библиотека не помогает. –

6

Самый простой способ - вызвать ld с опцией -l. Это позволит эффективно проверить наличие библиотеки, автоматический поиск стандартных мест библиотеки:

$ ld -luuid 
ld: warning: cannot find entry symbol _start; not setting start address 
$ echo $? 
0 

$ ld -luuidblah 
ld: cannot find -luuidblah 
$ echo $? 
1 

# so... 
$ ld -luuid 2>/dev/null && echo "libuuid exists" || echo "libuuid not found" 

EDIT

Как dreamlax отметил, это не работает для всех вариантов UNIX. Я не знаю, если он будет работать на всех версиях Unix (я проверил Linux и OpenBSD), но вы можете попробовать это вместо:

$ echo "int main(){}" | gcc -o /dev/null -x c - -luuid 2>/dev/null 
$ echo $? 
0 

$ echo "int main(){}" | gcc -o /dev/null -x c - -luuidblah 2>/dev/null 
$ echo $? 
1 
+1

Это не согласуется. На моем Mac 'ld' возвращает 1 в обоих случаях. – dreamlax

+0

@dreamlax: Это позор. Все еще должно быть возможно решить, посмотрев на stderr команды, и это не может быть проблемой для OP, учитывая его цели unix: AIX, Sun и HP (упомянутые в его предыдущем вопросе). – mhawke

+0

Ваше второе решение (OS X здесь тоже) страдает от той же проблемы. Я бы назвал это ошибкой 'ld' OS X, но это все еще проблема. –

2

Вот что я сделал с помощью autoconf, который я показываю здесь, как твердый пример для тех, кто еще мог бы прийти к следующему:

Я создал файл configure.ac, который содержал следующее:

AC_INIT(package, 1.1, email) 
AC_CHECK_LIB(uuid, uuid_generate_random, [echo "libuuid exists"], [echo "libuuid missing"]) 

Я побежал следующие команды в порядке (та же папка я сделал configure.ac):

autoconf 
./configure 

В конце конфигурирования, он плюнул назад, был ли он или нет найден uuid_generate_random в uuid библиотеки. Казалось, что он отлично работает (хотя, к сожалению, две из ОС отсутствовали в библиотеке, но это еще одна проблема).

Для тех, кто может найти это после факта, аргументы AC_INIT здесь выбрасывают, и вы можете скопировать их оптом. Аргументами для AC_CHECK_LIB являются: имя библиотеки, имя функции в этой библиотеке, что делать с успехом, что делать с ошибкой.

Несмотря на то, что ответ Мехрдада был не так полезен, как мне бы хотелось (т. Е. Не тратить время на просмотр документов), это кажется правильным, и я буду принимать его. mhawke: Мне очень понравился ваш ответ, но я не был уверен, как проверить, чтобы он работал.Казалось, что на SunOS, но он всегда говорил «нет» на двух других (AIX, HPUX), и я, похоже, не мог придумать библиотеку с верхней части головы, я мог бы гарантировать ее обнаружение.

Спасибо за помощь, ребята.

Смежные вопросы