Static library CURL?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ZagZag, 21 Oct 2009.

  1. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Как можно прилепить CURL в прогамме, чтоб все было в одном файле, без надобности таскать libcurl.dll
    Реально ли это?

    Я скачал исходнички CURL, собрал с помощью Dev-C++ mingw32
    На выходе получились:
    libcurl.a 298 КБ
    libcurl.dll 207 КБ
    libcurldll.a 35,8 КБ
    Если собирать прогу с помощью libcurldll.a, то все отлично компилится, прога получается 6 Кб, но требует наличия libcurl.dll
    А вот как собрать с помощью libcurl.a ?
    Пофиг что прога больше получится, это не критично.
    Нашел в инете про ключик -DCURL_STATICLIB, но незнаю как и где его применить

    Джоин EXE+libcurl.dll не предлагать, охота все по-грамотному сделать
     
  2. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    1. LoadLibrary('libcurl.dll');
    DLL, положить в папку с прогой
    2. Сделать импорт необходимых функций из libcurl.dll, статически или динамически
     
  3. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    2 вопрос:
    Dev-cpp 4.9.9.2 вставляет в каждый экзешник текст:
    Code:
    -LIBGCCW32-EH-2-SJLJ-GTHR-MINGW32   w32_sharedptr->size == sizeof(W32_EH_SHARED) %s:%u: failed assertion `%s'
      ../../gcc/gcc/config/i386/w32-shared-ptr.c  GetAtomNameA (atom, s, sizeof(s)) !=
    Видимо баг в бета-версии. Как от этого избавиться?
     
    #3 ZagZag, 21 Oct 2009
    Last edited: 21 Oct 2009
  4. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    1. LoadLibrary('libcurl.dll');
    Не катит. Я же как раз спрашиваю как избавиться от необходимости libcurl.dll
    2. Сделать импорт необходимых функций из libcurl.dll, статически или динамически
    Динамически - не интересует
    Статически - не умею, объясни подробнее, если не сложно
     
  5. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    перенести весь функционал из libcurl.dll в свою прогу, в отдельный юнит
    Delphi: function <имя функции>(<параметры>): integer; stdcall; external '<имя DLL>' name 'Имя функции в DLL';
    C++: extern "C" __declspec(dllimport)double AddNumbers(double a, double b);

    Но, как я понял, тебя это не интересует, ибо ты хочешь избавиться от этой либы
     
  6. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Чтобы перенести весь функционал из libcurl.dll в свою прогу, нужно собрать прогу со статической библиотекой curl. При сборке curl из исходников генерится файл libcurl.a, размер которого даже немного превышает libcurl.dll. Интуиция подсказывает что в нем содержится весь функционал. Но вот как его подключить к проекту, я не знаю.
    Если в линкере поменять libcurldll.a на libcurl.a, то выдается куча ошибок что функции для curl не определены
     
  7. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Вот нашел, кажется то что нужно.
    http://lenkite.blogspot.com/2007/11/quickstart-libcurl-and-mingw-plain-http.html

    Но у меня не пашет, выдает кучу ошибок
    Z:\PROJECT\curl-7.19.6\docs\examples>gcc -DCURL_STATICLIB -I ..\..\include simple.c ..\..\lib\libcurl.a -lws2_32 -lwinmm -o simple
    ..\..\lib\libcurl.a(ldap.o)(.text+0x29b): undefined reference to `_imp__ldap_set_optionA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x2be): undefined reference to `_imp__ldap_initA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x2e2): undefined reference to `_imp__ldap_set_optionA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x31e): undefined reference to `_imp__ldap_simple_bind_sA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x37d): undefined reference to `_imp__ldap_search_sA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x3b0): undefined reference to `_imp__ldap_first_entry'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x3e4): undefined reference to `_imp__ldap_get_dnA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x45f): undefined reference to `_imp__ldap_first_attributeA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x486): undefined reference to `_imp__ldap_get_values_lenA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x5f8): undefined reference to `_imp__ldap_value_free_len'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x62a): undefined reference to `_imp__ldap_memfreeA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x644): undefined reference to `_imp__ldap_next_attributeA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x65b): undefined reference to `_imp__ldap_memfreeA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x679): undefined reference to `_imp__ldap_next_entry'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x68d): undefined reference to `_imp__ldap_err2stringA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x6db): undefined reference to `_imp__ldap_unbind_s'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x741): undefined reference to `_imp__ldap_msgfree'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x777): undefined reference to `_imp__ldap_err2stringA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x7bb): undefined reference to `_imp__ldap_set_optionA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0x7ee): undefined reference to `_imp__ldap_simple_bind_sA'
    ..\..\lib\libcurl.a(ldap.o)(.text+0xa30): undefined reference to `_imp__ber_free'
    ..\..\lib\libcurl.a(ldap.o)(.text+0xa41): undefined reference to `_imp__ldap_err2stringA'
    collect2: ld returned 1 exit status
     
  8. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Уря! Как всегда - нашел решение сам =D
    http://article.gmane.org/gmane.comp.gnu.octave.maintainers/9640
    Надо было добавить еще ключик -lwldap32
    В итоге:
    gcc -DCURL_STATICLIB -I ..\..\include simple.c ..\..\lib\libcurl.a -lws2_32 -lwinmm -lwldap32 -o simple
    Создает прогу размером 260 Кб, которая не нуждается в libcurl.dll
     
  9. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Чтобы это дело компилилось в Dev-cpp, надо:
    1. Создать C-проект
    2. Проект - Параметры проекта (Alt + P) - Вкладка параметры
    В поле "компилятор" дописать -DCURL_STATICLIB
    В "компоновщик" -lcurl -lws2_32 -lwldap32
    И закинуть libcurl.a в папку C:\Dev-Cpp\lib
    В проге
    #include <curl/curl.h>
    ну и дальше как обычно работать с CURL
     
    1 person likes this.
  10. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    А можно как-нибудь собрать CURL без поддержки многопоточности?
     
  11. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    помогите пожалуйста интегрировать библиотеку cURL в visual studio 2008. Если можно объясните как все пошагово сделать. заранее благодарю.
     
  12. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    В начале кода надо дописать:
    #pragma comment (lib,"curl.lib") // Название библиотеки может быть другое, хз
    #include <curl/curl.h>
    И подключить папки lib и include от cURL в проекте, или скопировать их содержимое в папку со студией (не в саму папку, а туда где конкретно С++ лежит)
    А вообще-то у меня студии нет, так что я это написал по памяти.