Подключение исходных файлов к проекту - на примере Libcurl
От: Optimus1  
Дата: 24.11.21 08:26
Оценка:
Здравствуйте,

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

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

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

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

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

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

#include <iostream>
#include "curl.h"


int main()
{

std:cout<<"Hello libcurl"<<std::endl;


CURL* curl;
CURLcode res;

curl = curl_easy_init();
}


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

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

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

Может кто нибудь может подсказать ?
Re: Подключение исходных файлов к проекту - на примере Libcurl
От: kov_serg Россия  
Дата: 24.11.21 08:34
Оценка:
Здравствуйте, Optimus1, Вы писали:

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

__imp__ как бы намекает что бы что нужна динамическая библиотека. Что бы это поправить следует заглянуть в header
...
/*
 * libcurl external API function linkage decorations.
 */

#ifdef CURL_STATICLIB
#  define CURL_EXTERN
#elif defined(CURL_WIN32) || defined(__SYMBIAN32__) || \
     (__has_declspec_attribute(dllexport) && \
      __has_declspec_attribute(dllimport))
#  if defined(BUILDING_LIBCURL)
#    define CURL_EXTERN  __declspec(dllexport)
#  else
#    define CURL_EXTERN  __declspec(dllimport)
#  endif
#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS)
#  define CURL_EXTERN CURL_EXTERN_SYMBOL
#else
#  define CURL_EXTERN
#endif
...

/DCURL_STATICLIB к ключам компиляции не помогает?
Re: Подключение исходных файлов к проекту - на примере Libcurl
От: Zhendos  
Дата: 24.11.21 10:22
Оценка:
Здравствуйте, Optimus1, Вы писали:

O>Здравствуйте,


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


Обычно как раз почти так и делают. Если проект должен под кучу платформ собираться,
то просто включают зависимости как "git submodule" или просто копированием исходников.
Правда после этого обычно добавляют что-то типа:
add_subdirectory(3rdparty/curl)


В главный `CMakeLists.txt` и потом уж из главного cmake генерируют
solution для VisualStudio и открывают его.
Хотя вроде теперь генерация не актуальна и VisualStudio умеет напрямую с CMakeLists.txt работать.
Re: Подключение исходных файлов к проекту - на примере Libcurl
От: Mr.Delphist  
Дата: 24.11.21 11:09
Оценка:
Здравствуйте, Optimus1, Вы писали:

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


У кого-то тут на форуме была в подписи фраза "Your code should compile and link", последние два слова выделены. Собственно, при подключении любой сишной либы надо сделать эти два действия
1) Осчастливить компилятор
2) Осчастливить линкер

Как уже сказали выше, режимов сборки у любой библиотеки несколько. Минимум два варианта обычно: статическая или динамическая, сюда же докидываем второе измерение Debug/Release, а можно ещё и с выравниваниями данных поиграть, или хардварно-архитектурными вещами типа Little/big endian и т.п... И это не говоря про зависимости для самой библиотеки (какой рантайм подтянуть — виндовый или MinGW, какие сторонние либы надо, надо ли задружить разные системы сборки типа AutoTools, CMake...). Поэтому искусство собирать сложные вещи типа OpenSSL — это отдельный скилл, который тоже надо прокачивать.
Re: Подключение исходных файлов к проекту - на примере Libcurl
От: Maniacal Россия  
Дата: 24.11.21 14:56
Оценка: +1
Здравствуйте, Optimus1, Вы писали:

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


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


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


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


Нужно ещё все .cpp-шники в проект добавить
Re[2]: Подключение исходных файлов к проекту - на примере Li
От: Optimus1  
Дата: 24.11.21 16:21
Оценка:
В общем сделал, как порекомендовал все таки qaz77 сделать в соседней теме.
Просто с помощью встроенного Native Tools Command Promt VS2019 собрал release/debud .lib.

Все работает.

Единственно, я попробовал самый первый простой пример — GET запрос HTML, пример почему то работает на всех сайтах. Хотя я вроде бы OpenSSL не подключал и https страничуи вроде бы не должны сервером отдаваться, что то не понятен мне этот момент.
Отредактировано 24.11.2021 16:21 Optimus1 . Предыдущая версия .
Re[3]: Подключение исходных файлов к проекту - на примере Li
От: Mr.Delphist  
Дата: 24.11.21 17:02
Оценка:
Здравствуйте, Optimus1, Вы писали:

O>Единственно, я попробовал самый первый простой пример — GET запрос HTML, пример почему то работает на всех сайтах. Хотя я вроде бы OpenSSL не подключал и https страничуи вроде бы не должны сервером отдаваться, что то не понятен мне этот момент.


А в ответе-то что внтури? Может, там редирект или заглушка какая.
Re[4]: Подключение исходных файлов к проекту - на примере Li
От: Optimus1  
Дата: 24.11.21 17:18
Оценка: +1
MD>А в ответе-то что внтури? Может, там редирект или заглушка какая.

Нее, разобрался, я использовал для сборки каталог Project для Windows, а с этим каталогом оказывается уже собирается .lib с поддержкой Openssl.
Re[5]: Подключение исходных файлов к проекту - на примере Li
От: qaz77  
Дата: 25.11.21 07:22
Оценка:
Здравствуйте, Optimus1, Вы писали:
O>а с этим каталогом оказывается уже собирается .lib с поддержкой Openssl.

Вот это вряд ли.
OpenSSL еще то монстр, он, конечно не содержится в каталоге curl ни в каком виде.
Как бы курл с ним собрался вот просто так?

Нет. У тебя скорее всего собралась версия с использованием Windows SSPI.
Это встроенный в винду криптопровайдер.
Это единственный вариант сборки курл, который не требует еще каких-то либов.

С Windows SSPI есть такая проблема, что на старых виндах (XP, Vista) не поддерживается
TLS 1.3, который требуют многие нынешние сервера.

Для своих проектов я в результате собирал курл с OpenSSL.
Но для этого надо собрать OpenSSL и подложить его хидеры и либы в определенное место относительно curl.
Re[6]: Подключение исходных файлов к проекту - на примере Li
От: Optimus1  
Дата: 25.11.21 08:32
Оценка:
Q>Нет. У тебя скорее всего собралась версия с использованием Windows SSPI.
Q>Это встроенный в винду криптопровайдер.
Q>Это единственный вариант сборки курл, который не требует еще каких-то либов.

Да, я опять термины перепутал
Все верно Windows SSPI.


Q>Для своих проектов я в результате собирал курл с OpenSSL.

Q>Но для этого надо собрать OpenSSL и подложить его хидеры и либы в определенное место относительно curl.

Я попытался дополнительно собрать с поддержкой zlib.
Для этого собрал статический либ-файл (x32, debug), далее сделал как написано в инструкции, собрал дополнительно спараметрами:

WITH_ZLIB=static
ZLIB_PATH=path


Все собралось, создался файл — libcurl_a_debug.lib.

Подключил к проекту, запускаю libcurl`овский пример с параметром CURLOPT_ENCODING, чтобы проверить работу zlib, но опять супятся ошибки «неразрешенного символа»:

Ошибка LNK2019 ссылка на неразрешенный внешний символ _zlibVersion в функции _inflate_stream.

Ошибка LNK2019 ссылка на неразрешенный внешний символ _inflate в функции _inflate_stream.

Ошибка LNK2019 ссылка на неразрешенный внешний символ _inflateEnd в функции _exit_zlib


То есть в хедере эти функции/переменные есть, но в итоговом файле libcurl_a_debug.lib — их нет получается ??

А почему так получается ?
Отредактировано 25.11.2021 9:09 Optimus1 . Предыдущая версия . Еще …
Отредактировано 25.11.2021 8:35 Optimus1 . Предыдущая версия .
Отредактировано 25.11.2021 8:33 Optimus1 . Предыдущая версия .
Re[7]: Подключение исходных файлов к проекту - на примере Li
От: qaz77  
Дата: 25.11.21 09:02
Оценка:
Здравствуйте, Optimus1, Вы писали:
O>-Ладно, я переименовал zlibstaticd.lib на zlib_a.lib, но ошибка таже.

Если опять ошибка, что файл не найден, то куда-то не туда его кладешь.
Надо в опциях линкера смотреть список директорий, где ищутся либы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.