Определите, установлена ли библиотека C на Unix

Ваш код:

db.accommodations.find({ name : { $size: { $gt : 1 } }})

не работает, потому что это означает: находят имя, где больше, чем каждый - размер

Вместо этого, необходимо было записать:

db.accommodations.find({ name : { $gt: { $size : 1 } }})

, Что означает: находят имя, где размер больше, чем один

6
задан Community 23 May 2017 в 11:58
поделиться

4 ответа

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

9
ответ дан 8 December 2019 в 13:01
поделиться

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

0
ответ дан 8 December 2019 в 13:01
поделиться

Самый простой способ - вызвать 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
7
ответ дан 8 December 2019 в 13:01
поделиться

Вот что я сделал с помощью 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), и я не мог придумать такую ​​библиотеку, которую я мог бы гарантировать, что она найдется.

Спасибо за помогите ребята.

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

Спасибо за помогите ребята.

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

Спасибо за помогите ребята.

2
ответ дан 8 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

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