Почему libcurl отображается как непригодный на Mac OS X?

Вопрос или проблема

Я запускаю команду 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), система всё же сообщает о том, что библиотека "не используется". Давайте подробнее разберёмся в причинах этой проблемы и возможных способах её решения.

Причины проблемы

  1. Проблемы с разрешениями и доступом к библиотекам:
    В macOS существует ряд ограничений, связанных с доступом к системным библиотекам. Когда вы пытаетесь получить доступ к файлам, таким как /usr/lib/libcurl.4.dylib, вам может понадобиться больше прав, чем та, что даёт обычный пользователь. Ваша программа может не иметь доступа к этому пути, что происходит часто в современных версиях macOS, учитывая их акцент на безопасность.

  2. Отсутствие .dylib файла в стандартных директориях:
    По вашему коду и выводу можно увидеть, что файл /usr/lib/libcurl.4.dylib не найден, хотя библиотека есть в системе. Это может быть связано с тем, что макOS использует другие механизмы для управления библиотеками (например, libcurl может быть доступна в другом месте, или она может быть загружена динамически из контекста программы).

  3. Проблемы с конфигурационным скриптом:
    Как вы правильно заметили, возможно, скрипт конфигурации, который вы используете, не соответствует современным стандартам поиска библиотек. Могут быть проблемы с тем, как он определяет "успешные" версии библиотек или как осуществляет поиск необходимых файлов.

Рекомендации по решению

  1. Проверка расположения библиотеки:
    Убедитесь, что библиотека libcurl действительно установлена на вашей системе. Чтобы найти её, выполните команду:

    find /usr/local/lib -name "libcurl*"
  2. Установка с использованием Homebrew:
    Если библиотека не установлена, рекомендуется установить её с помощью Homebrew. Если вы ещё не установили Homebrew, вы можете сделать это, выполнив команду:

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    Затем установите libcurl:

    brew install curl
  3. Изменение конфигурационных параметров:
    Если вы установили libcurl, но скрипт всё ещё не видит его, попробуйте вручную указать путь к библиотеке при запуске конфигурационного скрипта:

    ./configure --with-curl=/usr/local/opt/curl
  4. Создание тестового приложения:
    Попробуйте создать однофайловую 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 могут быть запутанными, но поэтапный подход к решению может помочь вам справиться с ними. Убедитесь, что у вас есть все необходимые права, используйте поддерживаемые методы установки и, при необходимости, изменяйте конфигурации или создавайте тестовые приложения для диагностики. Обновление скриптов конфигурации и библиотек также может быть важным шагом в решении данной проблемы.

Оцените материал
Добавить комментарий

Капча загружается...