LINUX.ORG.RU

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

 , ,


0

1

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

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

Не собирать библиотеку в бинарный файл под конкретную 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 ?

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

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



Последнее исправление: xaizek (всего исправлений: 3)

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

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

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

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

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

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

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

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

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

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

apt_install_lrzsz ★★★
()

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

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

Djanik
()
Ответ на: комментарий от apt_install_lrzsz

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

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

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

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

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

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

Optimus1
() автор топика
Последнее исправление: Optimus1 (всего исправлений: 1)
Ответ на: комментарий от apt_install_lrzsz

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

Djanik
()

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

Non problem.

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

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

anonymous
()

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

rumgot ★★★★★
()
Ответ на: комментарий от Djanik

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

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

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от Optimus1

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

apt_install_lrzsz ★★★
()
Ответ на: комментарий от Djanik

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

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

apt_install_lrzsz ★★★
()
Ответ на: комментарий от rumgot

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

Djanik
()
Ответ на: комментарий от Djanik

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

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

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

Optimus1
() автор топика
Последнее исправление: Optimus1 (всего исправлений: 1)
Ответ на: комментарий от Djanik

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

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

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 2)
Ответ на: комментарий от Djanik

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

SR_team ★★★★★
()

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

PhysShell ★★
()
Ответ на: комментарий от Djanik

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

Ты прикалываешься?

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

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


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

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

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 2)
Ответ на: комментарий от Djanik

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

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

rumgot ★★★★★
()
Ответ на: комментарий от Djanik

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

t184256 ★★★★★
()

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

pathfinder ★★★★
()
Ответ на: комментарий от MOPKOBKA

vcpkg

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

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

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

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

anonymous
()
Ответ на: комментарий от Optimus1

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

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

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

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

anonymous
()

Смотри, в любой 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 ★★★★★
()
Ответ на: комментарий от menangen

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

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

Всем спасибо!

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

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

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

Optimus1
() автор топика
Последнее исправление: Optimus1 (всего исправлений: 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 ★★★★★
()
Ответ на: комментарий от Optimus1

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

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

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

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

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

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

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

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

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

Я умолкаю
anonymous
()
Ответ на: комментарий от Optimus1

Нихрена программист не знает. С кодом идет CMake.txt который проверяет наличие нужных файлов в системе и автоматом подключает их в выходной Makefile.

Djanik
()
Ответ на: комментарий от LamerOk

Знает, что он делает.

Если «он» знает, что он делает, то зачем использует libcurl, писал бы на сокетах с помощью api ОС, реализовывал бы http-протокол и прочее взаимодействие.

Optimus1
() автор топика

весь рунет заспамили своим отстоем

пойдите книжку по Си или С++ купите почитайте

а еще лучше на курсы программирование запишитесь

там такой элементарщина на первых двух уроках учат

anonymous
()
Ответ на: комментарий от anonymous

там такой элементарщина на первых двух уроках учат

Какой именно ? Почему меня, тогда не научили ? :( PS: Это вы на том курсе в мае - преподавали ?

Optimus1
() автор топика
Последнее исправление: Optimus1 (всего исправлений: 1)
Ответ на: комментарий от LamerOk

Тебе ещё рано

Так я не против. Просто anonystus всю тему, как он выразился «заспамил своим отстоем».

Optimus1
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.