Перейти к содержимому

Как подключить curl c

  • автор:

Как подключить curl к проекту

Здравствуйте я не совсем понимаю каким образом нужно подключать curl откуда скачивать и т.д Насколько я понял в проекте нужно включить curl.h и libcurl.lib но когда я скачиваю curl https://curl.se/windows/ там нет libcurl.lib поэтому я не понимаю я что-то не то скачиваю или где-то не там ищу libcurl.lib . Поэтому возник у меня вопрос откуда нужно скачать curl и что подключить что-бы он заработал в проекте

Отслеживать

задан 31 июл 2021 в 7:28

VladimirIfraimov VladimirIfraimov

3 2 2 бронзовых знака

curl.h и libcurl.lib можно получить скачав исходники и самостоятельно собрав библиотеку с настройками, совместимыми с настройками вашего проекта.

Работаем в сетью с помощью libcurl

В этой статье я бы хотел осветить вопросы взаимодействия с Web и Ftp серверами в C++ программе. Никто не запрещает программировать сокеты и самостоятельно реализовывать протоколы. Но зачем изобретать велосипед, когда существует готовое, отлаженное и мощное решение, способное удовлетворить практически любые Ваши потребности? Речь идет о библиотеке libcurl. Это простая в использовании, кроссплатформенная (поддерживаются Linux, Windows, Solaris, Qnx, FreeBSD, OpenBsd, MacOS X и многие другие) клиентская библиотека, позволяющая работать с протоколами FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE. Поддерживаются SSL сертефикаты, HTTP POST, HTTP PUT, FTP закачка, HTTP закачка, прокси-сервера, куки, аутентификация, восстановление закачки файла, тунелирование http proxy и многое другое. Libcurl имеет завязки на множество языков программирования, среди которых: C, C++, Java, Lisp, PHP, Ruby, Perl, Pascal, Haskell.

автор: oleg kutkov

И самое главное — библиотека полностью свободна, как для некоммерческого, так и для коммерческого применения. Разумеется, перед тем, как начать использование библиотеку — ее нужно получить, установить и дать возможность, своему компилятору, использовать ее. Рассмотрим выполнение этих действий, как обычно на примере двух платформ: Linux и Windows.

Установка в Linux

В случае Linux — все довольно просто, Вам необходимо скачать http://curl.haxx.se/download/curl-7.16.2.zip. В этом архиве содержиться полный исходный код библиотеки, скрипты сборки, а так же полная документация API и примеры (поэтому пользователям Windows так же не помешает скачать себе этот архив). После распаковки — необходимо выполнить стандартную процедуру компиляции и установки, с помощью configure и make && make install. Это все, можно пользоваться возможностями библиотеки. Для компиляции программы, следуюет добавлять к опциям компилятора

pkg-config --libs libcurl 
pkg-config --cflags libcurl
curl-config --libs libcurl 
curl-config --cflags libcurl

Установка в Windows

В случае Windows — немного сложнее.
Вам необходимо скачать http://my.guardpuppy.com/libcurl-7.1…zlib-1.2.3.zip. Распаковать следующие файлы в указанные места:

libcurl.dll — распаковать в %SystemDrive%\%SystemRoot%\System32
libeay32.dll — распаковать в %SystemDrive%\%SystemRoot%\System32
ssleay32.dll — распаковать в %SystemDrive%\%SystemRoot%\System32
zlib1.dll — распаковать в %SystemDrive%\%SystemRoot%\System32

Если Вы используете Visual Studio 98, то libcurl_imp.lib распаковать в %SystemDrive%\Program Files\Microsoft Visual Studio\VC98\Lib

Если Вы используете VisualStudio 2005 и новее, то libcurl_imp.lib распаковать в %SystemDrive%\Program Files\Microsoft Visual Studio 9.0\VC\lib

Распаковать содержимое каталога include полность:
Если Вы используете Visual Studio 98, то распаковать в %SystemDrive%\Program Files\Microsoft Visual Studio\VC98\Include
Если Вы используете VisualStudio 2005 и новее, то libcurl_imp.lib распаковать в %SystemDrive%\Program Files\Microsoft Visual Studio 9.0\VC\Include

Следует обратить внимание, что перед компиляцией проекта, во всех версиях Visual Studio, необходимо зайти в параметры проекта, перейти в раздел опций линковщика (linking), выбрать из выпадающего списка группу input и в появившийся список подключаемых, при компиляции, библиотек добавить, в самом конце, libcurl_imp.lib

Так же в архиве содержится консольная утилита curl.exe, позволяющая использовать все возможности библиотеки, в командном режиме.

Написание кода

Теперь все готово и можно приступать к рассмотрению библиотеки и написанию кода.

Для использования библиотеки необходимо подключить заголовочный файл curl.h

#include 

Доступ к функциям библиотеки осущствляеются после открытия новой easy сессии и получения управляющего интерфейса типа CURL. Без открытия сессии — вызывать какие либо фукнции запрещено. Для выполнения всех этих действий служит функция curl_easy_init(), она выполняет инициализацию библиотеки, открытие сессии и возвращает объект типа CURL или же NULL, в случае, когда что-то пошло не так.

CURL *curl; //объект типа CURL 
curl = curl_easy_init(); //инициализация
if(curl) //обязательная проверка
//выполнение всех дальнейших действий с библиотекой
>

Далее необходимо задать опции сессии, такие как URL, с которым мы собираемся работать, прокси сервер (если он есть), функции обратного вызова (о них ниже) и т.п.

Задание опций осуществляется с помощью функции curl_easy_setopt. Рассмотрим ее объявление и параметры:

CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

CURL *handle — указатель на интерфейс, который мы получили выше.
CURLoption option — название опции, которую следует задать.
parameter — параметр, который связывается с опцией, это может быть число, указатель на функцию, строка. Функцию можно вызывать несколько раз подряд, задавая необходимые опции. Все опции, по умолчанию, выключены.

Рассмотрим наиболее интересные и используемые опции, а так же их параметры.

CURLOPT_HEADER — применяется при работе с HTTP, ненулевое значение параметра заставляет библиотеку отображать заголовок в теле запрошенной страницы.
CURLOPT_WRITEFUNCTION — данная опция позволяет задавать, в качестве параметра, указатель на функцию обратного вызова. Эта функция вызывается библиотекой, каждый раз, когда принимаются какие либо данные, требующие дальнейшего использования или сохранения. Описание функции будеит преведено ниже.
CURLOPT_WRITEDATA — эта опция определяет параметр, как объект, в который производится запись принимаемых данных.
CURLOPT_READFUNCTION — опция полностью аналогичная CURLOPT_WRITEFUNCTION, но используетс для передачи данных удаленному узлу.
CURLOPT_READDATA — аналогично CURLOPT_WRITEDATA, но так же для передачи.
CURLOPT_ERRORBUFFER — опция определяет строковый параметр, в который будут записываться сообщения об ошибках в читабельном, для людей, виде.
CURLOPT_URL — очень важная опция, в параметре указывается строка — URL, с которым собираемся взаимодействовать. В строке параметра можно указать небходимый протокол, в виде стандартного префикса «http://» или «ftp://».
CURLOPT_PROXY — опция, определяет строковый параметр — адрес и порт прокси-сервера. Параметр имеет стандартный вид: айпи-адрес (или имя, если есть возможность это имя разрешить) сервера и через двоеточние порт. Например: «proxy:8080»
CURLOPT_PROXYTYPE — параметр этой опции задает тип прокси. Возможные значения параметра: CURLPROXY_HTTP, CURLPROXY_SOCKS4, CURLPROXY_SOCKS5
CURLOPT_HTTPPROXYTUNNEL — ненулевое значение параметра этой опции включает туннелирование вышеуказанного прокси.
CURLOPT_INTERFACE — строковый параметр этой опции задает внешний интерфейс, это может быть как айпи-адрес, так и имя. Разумеется, если сетевой интерфейс — единственный, эту опцию
CURLOPT_PORT — эта опция позволяет задать номер порта удаленного узла. Если эта опция не задается, для соеинения используется порт по умолчанию, для протокола (http — 80, ftp — 21 и т.д.).
CURLOPT_PROXYUSERPWD — эта опция используется для аутентификации на прокси-сервере. Параметр передается в виде строки «логин:пароль».
CURLOPT_USERPWD — опция используется для HTTP аутентификации. Параметр аналогичен предидущему.
CURLOPT_HTTPAUTH — параметр этой опции определяет тип HTTP аутентификации, возможные значения:
CURLAUTH_BASIC — базовый вид аутентификации, используемый, как правило, по умолчанию. Имя пользователя и пароль передаются открытым текстом.
CURLAUTH_DIGEST — является более безопасной версией предидущей.
CURLAUTH_GSSNEGOTIATE — метод аутентификации Microsoft, используемый на серверах этой компании. Поддерживает аутнетификацию Kerberos5. Для использования этого вида аутентификации необходима библиотека GSS.
CURLAUTH_NTLM — метод, так же разработанный и используемый Microsoft, для защиты использует хеширование. Требует наличия OpenSSL.
CURLAUTH_ANY — этот параметр заставляет libcurl выбрать все типы аутентификации, срабатывает метод наиболее подходящий к данному случаю.
CURLAUTH_ANYSAFE — то же самое, только не выбирается CURLAUTH_BASIC аутентификация.

Я показал лишь наиболее общие опции, их список, на самом деле, очень велик, подробнее с ними можно ознакомится в HTML документации к библиотеке. Перед рассмотрением нашего первого примера стоит упомянуть еще две библиотечные функции, а так же функции обратного вызова, о которых я говорил выше.
void curl_easy_reset(CURL *handle) — выполняет повторную инициализацию библиотеки с установкой всеъ опций в значения по умолчанию.
void curl_easy_cleanup(CURL * handle) — Это функция должна вызываться самой последней и вызываться должна обязательно. Она выполняет завершение текущей сессии.
size_t function( void *ptr, size_t size, size_t nmemb, void *stream) — объявление функции, параметра опции CURLOPT_WRITEFUNCTION. Её аргументы:
ptr — указатель на принимаемые данные.
size — размер принимамого блока данных
nmemb — общее количество блоков данных, объем принимаемой информации определяется как size * nmemb
stream — это параметр опции CURLOPT_WRITEDATA, в который производится запись.

Возвращать функция должна общий размер принятой информации.
size_t function( void *ptr, size_t size, size_t nmemb, void *stream) — объявление функции, параметра опции CURLOPT_READFUNCTION. Назначение всех аргументов аналогичное, только здесь выполняется чтение данных из исходного stream и передача libcurl через ptr. Возвращать функция должна общий размер переданной информации.

Теперь рассмотрим небольшой пример, показывающий инициализацию библиотеки, задание некоторых опций, а так же, знакомящий нас с еще одной важной функцией.

//подключение необходимых заголовочных файлов 
#include
#include
//главная функция
int main(void)
//уже знакомый объект CURL
CURL *curl;
//объект - результат вызова функции curl_easy_perform
CURLcode res;
//выполняем инициализацю
curl = curl_easy_init();
if(curl) < //проверяем
//задаем опцию - получить страницу по адресу http://google.com
curl_easy_setopt(curl, CURLOPT_URL, "google.com");
//указываем прокси сервер
curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
//задаем опцию отображение заголовка страницы
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
//вызываем функцию, выполняющюю все операции, заданные в опциях (получение страницы, передача данных и т.д.), результат - объект типа CURLcode
res = curl_easy_perform(curl);
//выполняем обязательное завершение сессии
curl_easy_cleanup(curl);
>
return 0;
>

Пример крайне прост и понятен, комментарии излишни. Отмечу, что перед выполнением дальнейших действий с данным — необходимо проверить значение res, если резултат — 0, значит все прошло успешно, иначе — ошибка. Её описание можно получить, задав вышеописанный CURLOPT_ERRORBUFFER.

Теперь рассмотрим более серьезный пример, получающий и отображающий на стандартном выводе HTML страницу (разумеется в виде самого исходного языка разметки, без рендеринга). Будем использовать все необходимые проверки и функцию обратного вызова.

//подключаем необходимые заголовочные файлы 
#include
#include
#include "curl/curl.h"
//подключаем стандартное пространство имен
using namespace std;
//объявляем буфер, для хранения возможной ошибки, размер определяется в самой библиотеке
static char errorBuffer[CURL_ERROR_SIZE];
//объялвяем буфер принимаемых данных
static string buffer;
//функция обратного вызова
static int writer(char *data, size_t size, size_t nmemb, string *buffer)
//переменная - результат, по умолчанию нулевая
int result = 0;
//проверяем буфер
if (buffer != NULL)
//добавляем к буферу строки из data, в количестве nmemb
buffer->append(data, size * nmemb);
//вычисляем объем принятых данных
result = size * nmemb;
>
//вовзращаем результат
return result;
>

//главная функция
int main(void)
//необходимые CURL объекты
CURL *curl;
CURLcode result;
//инициализируем curl
curl = curl_easy_init();
//проверяем результат инициализации
if (curl)
//задаем все необходимые опции
//определяем, куда выводить ошибки
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
//задаем опцию - получить страницу по адресу http://google.com
curl_easy_setopt(curl, CURLOPT_URL, "google.com");
//указываем прокси сервер
curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
//задаем опцию отображение заголовка страницы
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
//указываем функцию обратного вызова для записи получаемых данных
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
//указываем куда записывать принимаемые данные
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &amp;amp;buffer);
//запускаем выполнение задачи
result = curl_easy_perform(curl);
//проверяем успешность выполнения операции
if (result == CURLE_OK)
//выводим полученные данные на стандартный вывод (консоль)
cout else
//выводим сообщение об ошибке
cout >
//завершаем сессию
curl_easy_cleanup(curl);
return 0;
>

Добавлю к коду небольшие пояснения. Рассмотрим writer — функцию обратного вызова. Ее объявление нам уже знакомо. Функция должна возвращать общее количество принятых данных, иначе ошибка. Наша функция, в случае невыполнения действия записи в буфер будет возвращать значение result по умолчанию — 0. Собственно выполнение записи выполняется только в том случае, если буфер не является NULL. Т.к. мы работаем со строковыми данными — запись в буфер осуществляется вызовом метода append, класса string. Возвращаемое значение — произведение аргументов size и nmemb.

Задание опций дополнительных комментариев, думаю, не требует. После вызова curl_easy_perform происходит проверка возвращенного значения, если оно равно CURLE_OK (этот код определен в curl/curl.h) — происходит вывод содержимого буфера на экран (вывод можно организовать так же в файл или же передать другому приложению/участку, например html рендер-движку), иначе — выводится содержимое errorBuffer, содержащего текст ошибки. В самом конце происходит обязательное закрытие сесии. Этот же пример можно использовать для закачки файлов по фтп, заменив http на ftp, указав полный путь к файлу на сервере, а так же написав в функции writer код, пишуший получаемые байты в файл на диске. Разумеется, в таком случае, необходимо будет убрать вывод на экран.

Я постарался донести общие принципы использования этой библиотеки, больше примеров Вы можете найти в вышеописанном архиве, а так же на сайте разработчика: тема на форуме
Там же доступна обширная и полная документация.

Похожие статьи

  • Работа с NetLink в Linux. Часть 1
  • Кроссплатформенное Клиент — Серверное приложение
  • Взаимодействие с сетевыми интерфейсами в Linux
  • Загрузить изображение по ссылке с кириллицей
  • Определение IP с помощью стороннего сервиса
  • Ограничить доступ к программе
  • Задержки при отправке данных по сети TCP
  • Проблема соединения в локал. сети
  • Пример открытия 514 порта на PС и его прослушка
  • WIFI-switch, есть ли?

Введение в curl и его установка

Хотя Postman удобен, его трудно использовать для представления в документации, как совершать запросы с его помощью. Кроме того, разные пользователи, вероятно, используют разные клиенты с графическим интерфейсом или вообще не используют их (предпочитая командную строку)

Вместо того, чтобы описывать, как выполнять REST-запросы с использованием GUI-клиента, такого как Postman, наиболее традиционный метод документирования синтаксиса запроса — использовать curl.

О curl

curl — это утилита командной строки, которая позволяет выполнять HTTP-запросы с различными параметрами и методами. Вместо того, чтобы переходить к веб-ресурсам в адресной строке браузера, можно использовать командную строку, чтобы получить те же ресурсы, извлеченные в виде текста.

Note: Иногда curl пишется как cURL, что означает Client URL.

curl является более распространенным написанием, так что оба варианта верны.

Установка curl

curl доступен на MacOS по умолчанию, для Windows требуется установка. Ниже представлены инструкции по установке curl.

Установка на MacOS

Проверить установлен ли curl на MacOS можно так:

  1. Открываем Терминал (нажимаем Cmd + spacebar для открытия Спотлайт и вводим Terminal).
  2. В терминале пишем curl -V . Ответ должен быть примерно таким:
curl 7.54.0 (x86_64-apple-darwin16.0) libcurl/7.54.0 SecureTransport zlib/1.2.8 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets 

Если такого ответа нет, то curl необходимо скачать и установить

Установка на Windows

Установка curl в Windows включает другие шаги. Сначала определяем версию windows: 32-разрядная или 64-разрядная версия Windows, щелкнув правой кнопкой мыши Компьютер и выбрав Свойства . Затем следуем инструкциям на этой странице. Нужно выбрать одну из бесплатных версий с правами Администратора.

После установки проверяем версию установленной curl;

  1. Открываем командную строку нажав кнопку Пуск и введя cmd
  2. В строке пишем curl -V

Ответ должен быть примерно таким:

curl 7.54.0 (x86_64-apple-darwin14.0) libcurl/7.37.1 SecureTransport zlib/1.2.5 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz 

Создание тестового вызова API

После установки curl делаем тестовый вызов API

curl -X GET "https://api.openweathermap.org/data/2.5/weather?zip=95050&appid=fd4698c940c6d1da602a70ac34f0b147&units=imperial" 

В ответ должен вернуться минимизированный JSON:

"coord":"lon":-121.96,"lat":37.35>,"weather":["id":701,"main":"Mist","description":"mist","icon":"50d">],"base":"stations","main":"temp":66.92,"pressure":1017,"humidity":50,"temp_min":53.6,"temp_max":75.2>,"visibility":16093,"wind":"speed":10.29,"deg":300>,"clouds":"all":75>,"dt":1522526400,"sys":"type":1,"id":479,"message":0.0051,"country":"US","sunrise":1522504404,"sunset":1522549829>,"id":420006397,"name":"Santa Clara","cod":200> 

Note: В Windows в командной строке не работает Ctrl+V , нужно нажать правой кнопкой мыши и выбрать paste .

curl и Windows

Если вы используете Windows, обратите внимание на следующие требования к форматированию при использовании curl:

  • Используйте двойные кавычки в командной строке Windows. (Windows не поддерживает одинарные кавычки.);
  • Не используйте обратную косую черту \ для разделения строк. (Это только для удобства чтения и не влияет на вызов на Mac.)
  • Добавив -k в команду curl, вы можете обойти сертификат безопасности curl, который может быть необходимым.

Подключение исходных файлов к проекту — на примере Libcurl

Я уже понимаю, что так никто не делает, но мне все таки интересно сделать именно так.

Не собирать библиотеку в бинарный файл под конкретную IDE/компилятор, под конкретную ОС, с конкретными параметрами и зависимостями, а подключить к проекту именно исходные файлы библиотеки, ведь в них содержится вся реализация, правильно ??

Интересно то мне интересно, но не получается:

-Скачал исходники libcurl с их сайта: https://curl.se/download.html

-Создал свой проект в VS2019 и добавил туда все хедер файлы из папки libcurl/include.

-В проекте сделал include основного хедера и вызвал самою первую функцию инициализации libcurl:

#include #include "curl.h" int main()

Естественно — этого не достаточно, а VS выдает ошибку «ссылка на неразрешённый внешний символ __imp__curl_easy_init в функции _main.»

То есть VS вроде, как определение curl_easy_init — нашел, а вот саму, как я понимаю реализацию этой функции нет ?

И если примерно все так, вот и вопрос, а где найти эту реализацию, в каких файлах . И как его добавить в проект VS2019 ?

Может кто нибудь может подсказать ?

PS: Libcurl — позиционируется, как opensource библиотека, теоретически файлы реализации должны быть открытыми ?

Optimus1
24.11.21 11:35:32 MSK
1 2 →

Вопросы по VS2019 надо задавать на винфаке, а не на этом сайте.

fluorite ★★★★★
( 24.11.21 11:39:36 MSK )

ссылка на неразрешённый внешний символ

Ну так ты судя по всему подключаешь библиотеку именно как библиотеку (динамическую, бинарь короче говоря). А надо вызывать её функции из исходников.

apt_install_lrzsz ★★★
( 24.11.21 11:40:44 MSK )
Ответ на: комментарий от apt_install_lrzsz 24.11.21 11:40:44 MSK

Спасибо! Похоже, что это я и делаю. Вопрос, в том, как можно вызвать эту функцию из исходников и как найти эту функцию в каком она .с файле реализована ?

Optimus1
( 24.11.21 11:49:26 MSK ) автор топика
Ответ на: комментарий от Optimus1 24.11.21 11:49:26 MSK

как можно вызвать эту функцию из исходников

Как обычно вызывают функции из исходников. Добавляешь .с и .h в сборку и вызываешь.

в каком она .с файле реализована

Поиском по исходникам. Если б ты был в линуксе, я бы grep посоветовал.

В vs можешь добавить все .с в проект и воспользоваться тамошним поиском.

apt_install_lrzsz ★★★
( 24.11.21 11:54:01 MSK )

Не собирать библиотеку в бинарный файл под конкретную IDE/компилятор, под конкретную ОС, с конкретными параметрами и зависимостями, а подключить к проекту именно исходные файлы библиотеки, ведь в них содержится вся реализация, правильно ??

Не правильно. Не нужно заниматься онанизмом, а нужно скачать готовую dll под win64 или что там тебе нужно.

Djanik
( 24.11.21 11:55:54 MSK )
Ответ на: комментарий от fluorite 24.11.21 11:39:36 MSK

Вопрос про опенсорс программу задан в нужном месте, так что нехрен тут выступать.

Djanik
( 24.11.21 11:58:24 MSK )
Ответ на: комментарий от Djanik 24.11.21 11:55:54 MSK

Да ТС вроде осознаёт, что делает:

Я уже понимаю, что так никто не делает, но мне все таки интересно сделать именно так.

apt_install_lrzsz ★★★
( 24.11.21 12:00:13 MSK )
Ответ на: комментарий от apt_install_lrzsz 24.11.21 11:54:01 MSK

Как обычно вызывают функции из исходников. Добавляешь .с и .h в сборку и вызываешь.

Я так сделал в самом начале, загрузил все хедеры и .c файлы в проект и попытался пустой main скомпилировать, но VS выдал ошибки по типу:

C2371 curl_easy_init: переопределение; различные базовые типы Lib_curl

C2146 синтаксическая ошибка: отсутствие «)» перед идентификатором

«trusted_CAs» C2081 PSecPkgContext_IssuerListInfoEx: недопустимое имя в списке формальных параметров

Поэтому я решил подключать постепенно, чтобы попытается отследить, откуда вообще ошибки идут и почему. Почему вообще такие ошибки могут появится, если это по сути должен быть полностью рабочий код ?

Optimus1
( 24.11.21 12:05:17 MSK ) автор топика
Последнее исправление: Optimus1 24.11.21 12:06:52 MSK (всего исправлений: 1)

Ответ на: комментарий от apt_install_lrzsz 24.11.21 12:00:13 MSK

Собрать вижулстудией кривой код заточенный под gcc? Да хрен он его соберет. Я посестрински отговариваю его от порочных занятий.

Djanik
( 24.11.21 12:05:46 MSK )

Может кто нибудь может подсказать ?

Посмотрите в свойствах для компиляции и линковки проекта значение всех параметров.

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

anonymous
( 24.11.21 12:06:16 MSK )
Ответ на: комментарий от Djanik 24.11.21 12:05:46 MSK

он собирается студией без проблем

SR_team ★★★★★
( 24.11.21 12:17:03 MSK )

Не знаю, что там с визуальной студией, но в исходном коде curl (https://github.com/curl/curl) есть конфигурационный файл для сборки через CMake ( CMakeLists.txt ). Поэтому есть вероятность, что можно скопировать исходники curl в подкаталог в каталоге своего проекта и в своем CMakeLists.txt выполнить add_subdirectory(curl_sub_directory) и далее уже линковаться с целями curl. Также при конфигурировании CMake потребуется указать перемнные-параметры для правильного конфигурирования CMake.

rumgot ★★★★★
( 24.11.21 12:20:47 MSK )
Ответ на: комментарий от Djanik 24.11.21 12:05:46 MSK

Стоп. Ты пробовал это делать? Вот смотрю CMakeLists.txt у curl — так вот там есть условные действия при сборке через MSVC компилятор. Поэтому есть вероятность, что сборка через CMake + MSVC нормально пройдет.

И про кривость кода есть факты?

rumgot ★★★★★
( 24.11.21 12:23:50 MSK )
Последнее исправление: rumgot 24.11.21 12:24:28 MSK (всего исправлений: 1)

Ответ на: комментарий от Optimus1 24.11.21 12:05:17 MSK

Ну вот это хз, если честно. Могу только предположить, что визуальный компилятор не понимает что-то, предназначенное для gcc.

apt_install_lrzsz ★★★
( 24.11.21 12:25:42 MSK )
Ответ на: комментарий от SR_team 24.11.21 12:17:03 MSK

А почему у тс не собирается?

Djanik
( 24.11.21 12:26:09 MSK )
Ответ на: комментарий от Djanik 24.11.21 12:05:46 MSK

отговариваю его от порочных занятий.

С таким-то подходом конечно не соберёт.

apt_install_lrzsz ★★★
( 24.11.21 12:28:01 MSK )
Ответ на: комментарий от rumgot 24.11.21 12:23:50 MSK

Нахрен мне это делать, когда есть готовая сборка? Подозреваю там нужны дополнительные хидеры типа для ssl например или ipv6, которых в винде нет.

Djanik
( 24.11.21 12:29:16 MSK )
Ответ на: комментарий от Djanik 24.11.21 12:29:16 MSK

Подозреваю там нужны дополнительные хидеры типа для ssl например или ipv6, которых в винде нет.

Но, тогда бы VS выдал ошибку, что не может найти включение … такого то .h файла. Но такой ошибки не было.

Она может быть бы появилась бы, когда я вызвал бы функции libcurl, которые используют ssl или ipv6 для запроса. Но я вызывал, то самую первую функцию инициализации только.

Optimus1
( 24.11.21 12:32:47 MSK ) автор топика
Последнее исправление: Optimus1 24.11.21 12:33:54 MSK (всего исправлений: 1)

Ответ на: комментарий от Djanik 24.11.21 12:29:16 MSK

Так ты сначала попробуй.

Я вспомнил. Я собирал под виндой библиотеку CPR (https://github.com/libcpr/cpr), которая является C++ оберткой над curl. Так вот при сборке CMake + MSVC там настроено таким образом, что исходники curl скачиваются и она собирается автоматически. У меня все прошло нормально и далее работал с SSL соединениями в том числе. Поэтому давай не будем писать того, что лично не делали и в чем не уверены. Потом начитаются такой инфы и будут остальных учить, что curl кривой и в винде не собирается.

rumgot ★★★★★
( 24.11.21 12:33:55 MSK )
Последнее исправление: rumgot 24.11.21 12:34:29 MSK (всего исправлений: 2)

Ответ на: комментарий от rumgot 24.11.21 12:33:55 MSK

Где я написала, что не собирается? Я наоборот предлагала взять собранную dll и не маяться херней.

Djanik
( 24.11.21 12:39:44 MSK )
Ответ на: комментарий от Djanik 24.11.21 12:26:09 MSK

ТС творит херню. В CMakeLists.txt есть правила для MSVC у libcurl.

SR_team ★★★★★
( 24.11.21 12:46:13 MSK )

Там в архиве есть готовый проект libcurl под вижуалку, там же есть README по сборке. Посмотри, как он собирается, как настроен.

PhysShell ★★
( 24.11.21 13:06:12 MSK )
Ответ на: комментарий от Djanik 24.11.21 12:39:44 MSK

Где я написала, что не собирается?

Собрать вижулстудией кривой код заточенный под gcc? Да хрен он его соберет.

Я наоборот предлагала взять собранную dll и не маяться херней.

Так он же хочет исходник включать в состав своего проекта.

rumgot ★★★★★
( 24.11.21 13:08:25 MSK )
Последнее исправление: rumgot 24.11.21 13:08:48 MSK (всего исправлений: 2)

Ответ на: комментарий от Djanik 24.11.21 12:29:16 MSK

Подозреваю там нужны дополнительные хидеры типа для ssl например или ipv6, которых в винде нет.

С ipv6 не работал через curl. Но ssl в винде в curl точно работает, он может брать как бэкенд в виде OpenSSL так и в виде Schannel. Это опционально и указывается при конфигурировании CMake.

rumgot ★★★★★
( 24.11.21 13:16:41 MSK )

Погуглите «github Libcurl windows»

anonymous
( 24.11.21 13:16:42 MSK )
Ответ на: комментарий от Djanik 24.11.21 11:58:24 MSK

Нет. Посмотри для разнообразия, где ты флудишь.

t184256 ★★★★★
( 24.11.21 13:18:40 MSK )

Глянул в CMakeLists.txt этой библиотеки. Там есть опция BUILD_SHARED_LIBS, поставь её в OFF и линкуй библиотеку статически. Разницы между статической линковкой и тем что ты хочешь, почти нет.

pathfinder ★★★★
( 24.11.21 13:55:03 MSK )

MOPKOBKA ★★★
( 24.11.21 14:00:22 MSK )
Ответ на: комментарий от MOPKOBKA 24.11.21 14:00:22 MSK

Гуглим «vcpkg install libcurl» …

В чем проблема у ТС то?
Создаем новый проект, подключаем исходники, разбираемся с зависимостями, …

anonymous
( 24.11.21 14:12:36 MSK )
Ответ на: комментарий от anonymous 24.11.21 14:12:36 MSK

В чем проблема у ТС то? Создаем новый проект, подключаем исходники, разбираемся с >зависимостями, …

Проект создал, исходники подключили, видимо на зависимостях застрял.

Optimus1
( 24.11.21 14:15:50 MSK ) автор топика
Ответ на: комментарий от Optimus1 24.11.21 14:15:50 MSK

Проект создал, исходники подключили, видимо на зависимостях застрял.

Это ваши проблемы или чьи-то?

anonymous
( 24.11.21 14:20:58 MSK )
Ответ на: комментарий от anonymous 24.11.21 14:20:58 MSK

Минимум, точно мои.

Optimus1
( 24.11.21 14:22:19 MSK ) автор топика
Ответ на: комментарий от Optimus1 24.11.21 14:22:19 MSK

Visual Studio вам должна была предоставить о всех не слинкованных функциях.
Анализируйте их и разбирайтесь какие либы в проект нужно добавить …

anonymous
( 24.11.21 14:26:38 MSK )
Ответ на: комментарий от anonymous 24.11.21 14:26:38 MSK

https://curl.se/docs/libs.html Curl depends on external libraries for some features (and libcurl for all features)

Гуглим «libcurl dependencies»

anonymous
( 24.11.21 14:49:12 MSK )
Ответ на: комментарий от anonymous 24.11.21 14:49:12 MSK

https://curl.se/docs/libs.html Curl depends on external libraries for some features (and libcurl for all features)

ТС молчит - это минус. Но и не говорит, что есть вопросы, а это плюс. 

anonymous
( 24.11.21 16:49:39 MSK )

Естественно — это нихуя не работает, а VS посылает на хуй с ошибкой «ссылка на неразрешённый внешний символ __imp__curl_easy_init в функции _main.»

Только шта попробовал с гцц – УМВР

anonymous
( 24.11.21 16:56:22 MSK )

Смотри, в любой IDE тебе нужно добавлять файлы реализации в C проект не абы как а в определённой структуре: .c файлы добавлять в сборку, вместе с твоим main.c главным файлом проги, с которой всё стартует, т.е. у тебя компилятор, которым управлет IDE при старте сборки проекта, должен компилировать сразу все файлы .c: это и твой main.c и всякие libcurl.c и тп (не знаю как там разбита libcurl) а уже в твоём главном C исходнике, ты можешь подключать .h файлы, которые не нужно отдавать компилятору напрямую, т.е. в ide эти .h часто не добавляются в сборку, а только указывается путь где они лежат: -I параметр

Плюс, в IDE можно различные цели/таргеты указывать, собрать все libcurl.c файлы в одну статичную либу и прилинковать при сборке в твой экзешник с main.c, но линковкой занимается не компилятор, а линкер, этим тоже должна управлять IDE. Короче, хедеры отдельно, они включаются через инклуды в исходниках .c, а уже их компилирует компилятор и передаёт линковщику, который все .o объектные файлы собирает в единую .exe, в т.ч. и скомпилированные libcurl .c исходники в аналогичные .o, которые можно собрать в .a библиотеку в самой IDE и слинковать с main.o и получить исполняемый файл из начинки main.c + libcurl.c (.a статичная)

menangen ★★★★★
( 24.11.21 17:17:44 MSK )
Ответ на: комментарий от menangen 24.11.21 17:17:44 MSK

В IDE ничего не надо указывать, нужно использовать CMake

MOPKOBKA ★★★
( 24.11.21 17:58:53 MSK )
Ответ на: удаленный комментарий

Не смог я все таки осилить эту тему. И сделал все таки стандартным способом, собрал через Native Tools Command Promt VS2019 — статическую либу.

Единственно, что меня смутило, вот заинклудил я главный заголовочный файл curl.h, добавил libcurl_a_debug_x32.lib, а простой пример все равно не запускается, так как libcurl`у все равно требуются еще дополнительные win%ows dll-lib библиотеки, по типу сокетов и прочее соответствующие.

При этом в инструкции про это вообще ничего не сказано. Разве это правильно делать, так, чтобы пользователь сам догадывался чего не хватает для работы libcurl ? Или почему вообще libcurl сам их не иклудит у себя внутри через #pragma comment к примеру ?

Optimus1
( 24.11.21 18:51:14 MSK ) автор топика
Последнее исправление: Optimus1 24.11.21 18:54:21 MSK (всего исправлений: 2)

Компилировать исходники сторонней библиотеки вместе со своим проектом — это путь ламеров-вендузятников.

Правильно делать так

git clone https://github.com/curl/curl cd curl autoreconf -i ./configure --prefix=curl_install_prefix make make install 

и линковаться/конпеляться с тем, что лежит в curl_install_prefix/

1) У сторонней библиотеки может быть много разных опций конфигурации, задаваемых макросами с помощью системы сборки, которая используется этой библиотекой. Настраивать их вручную будет сложно и долго.

2) Если завтра в libcurl обнаружат какую-нибудь ужасную дыру безопасности, обновление исходников в своём проекте будет печальным и долгим занятием, на которые многие забивают, и в результате выходят дырявые программы с непропатченными уязвимостями

Harald ★★★★★
( 24.11.21 19:27:53 MSK )
Ответ на: комментарий от Optimus1 24.11.21 18:51:14 MSK

Подразумевается, что опытный программист это и так знает, это не курлоспецифичное знание.

Или почему вообще libcurl сам их не иклудит у себя внутри через #pragma comment к примеру ?

curl — кроссплатформенный проект, далеко не везде можно подключать библиотеки через #pragma

Harald ★★★★★
( 24.11.21 19:29:29 MSK )
Ответ на: комментарий от Harald 24.11.21 19:29:29 MSK

Подразумевается, что опытный программист это и так знает, это не курлоспецифичное знание.

Но, знает что ? Что Вы имеете ввиду ?

Optimus1
( 24.11.21 19:30:40 MSK ) автор топика
Ответ на: комментарий от Optimus1 24.11.21 18:51:14 MSK

При этом в инструкции про это вообще ничего не сказано.
Разве это правильно делать, так, чтобы пользователь сам догадывался чего не хватает для работы libcurl ?

М-да.
Тяжелый случай …

Я умолкаю 

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *