Вопрос или проблема
Я запускаю команду configure для установки определенного программного пакета, но она завершается ошибкой, когда доходит до требования libcurl.
Вот вывод, который она дает:
checking for the version of libcurl... 7.34.0
checking for libcurl >= version 7.15.2... yes
checking whether libcurl is usable... no
configure: error: Missing required libcurl >= 7.15.2
У меня установлена версия 7.34, которая больше требуемой 7.15.2, но по какой-то причине она не может быть использована.. (строка 3).
curl –version выводит следующее:
> curl --version
curl 7.34.0 (x86_64-apple-darwin13.0.0) libcurl/7.34.0 OpenSSL/1.0.1e zlib/1.2.8 libidn/1.26
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
Есть идеи, что здесь происходит?
Эта проблема может быть связана с функцией безопасности в macOS. Вероятно, невозможно прочитать полное содержимое /usr/lib
и выполнить stat
для файлов в этой папке. Однако возможно: загрузить эти файлы, особенно dylib
.
#include <stdio.h>
#include <dlfcn.h>
#include <sys/stat.h>
#include <curl/curl.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
struct stat stats = {};
int statResult = stat("/usr/lib/libcurl.4.dylib", &stats);
printf("stats: %i\n",statResult);
if (statResult != 0)
{
perror(NULL);
}
void* module = dlopen("/usr/lib/libcurl.4.dylib",RTLD_NOW);
printf("loaded: %p\n",module);
if (module != NULL)
{
curl_version_info_data*(*curlVersionInfo)(CURLversion) = dlsym(module, "curl_version_info");
if (curlVersionInfo == NULL)
{
printf("no curl function found\n");
}
else
{
curl_version_info_data* versionData = curlVersionInfo(CURLVERSION_NOW);
printf("loaded libcurl: %s\n",versionData->version);
}
}
}
Вывод на моем компьютере выглядит так:
stats: -1
No such file or directory
loaded: 0x3e4f90bd0
loaded libcurl: 8.4.0
Если я использую ls
в этой папке, я не вижу libcurl.4.dylib
нигде. Но связать файл вполне возможно. Поэтому, если ваш скрипт configure
проверяет существование libcurl.4.dylib
, он не будет успешным. Вам может потребоваться попробовать создать небольшой C-файл, который связывает libcurl, и попытаться его собрать/запустить.
Поскольку этот вопрос более 10 лет, я подозреваю, что скрипт configure
, о котором идет речь, давно исправлен, но поведение macOS остается неизменным.
Ответ или решение
Почему libcurl не работает на Mac OS X?
Вы столкнулись с проблемой при установке программного пакета, которая связана с библиотекой libcurl. Судя по сообщениям из вашего вывода конфигурационного скрипта, хотя версия libcurl на вашей машине (7.34.0) удовлетворяет минимальному требованию (7.15.2), система всё же сообщает о том, что библиотека "не используется". Давайте подробнее разберёмся в причинах этой проблемы и возможных способах её решения.
Причины проблемы
-
Проблемы с разрешениями и доступом к библиотекам:
В macOS существует ряд ограничений, связанных с доступом к системным библиотекам. Когда вы пытаетесь получить доступ к файлам, таким как/usr/lib/libcurl.4.dylib
, вам может понадобиться больше прав, чем та, что даёт обычный пользователь. Ваша программа может не иметь доступа к этому пути, что происходит часто в современных версиях macOS, учитывая их акцент на безопасность. -
Отсутствие .dylib файла в стандартных директориях:
По вашему коду и выводу можно увидеть, что файл/usr/lib/libcurl.4.dylib
не найден, хотя библиотека есть в системе. Это может быть связано с тем, что макOS использует другие механизмы для управления библиотеками (например,libcurl
может быть доступна в другом месте, или она может быть загружена динамически из контекста программы). -
Проблемы с конфигурационным скриптом:
Как вы правильно заметили, возможно, скрипт конфигурации, который вы используете, не соответствует современным стандартам поиска библиотек. Могут быть проблемы с тем, как он определяет "успешные" версии библиотек или как осуществляет поиск необходимых файлов.
Рекомендации по решению
-
Проверка расположения библиотеки:
Убедитесь, что библиотека libcurl действительно установлена на вашей системе. Чтобы найти её, выполните команду:find /usr/local/lib -name "libcurl*"
-
Установка с использованием Homebrew:
Если библиотека не установлена, рекомендуется установить её с помощью Homebrew. Если вы ещё не установили Homebrew, вы можете сделать это, выполнив команду:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Затем установите libcurl:
brew install curl
-
Изменение конфигурационных параметров:
Если вы установили libcurl, но скрипт всё ещё не видит его, попробуйте вручную указать путь к библиотеке при запуске конфигурационного скрипта:./configure --with-curl=/usr/local/opt/curl
-
Создание тестового приложения:
Попробуйте создать однофайловую C-программу, которая использует libcurl. Это позволит вам проверить, правильно ли загружается библиотека:#include <curl/curl.h> #include <stdio.h> int main(void) { CURL *curl = curl_easy_init(); if(curl) { printf("libcurl is available.\n"); curl_easy_cleanup(curl); } else { printf("libcurl is not usable.\n"); } return 0; }
Заключение
Проблемы с доступом и видимостью библиотек в macOS могут быть запутанными, но поэтапный подход к решению может помочь вам справиться с ними. Убедитесь, что у вас есть все необходимые права, используйте поддерживаемые методы установки и, при необходимости, изменяйте конфигурации или создавайте тестовые приложения для диагностики. Обновление скриптов конфигурации и библиотек также может быть важным шагом в решении данной проблемы.