Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как подключить cURL в Builder 2010


Автор: ZVano 21.2.2011, 16:20
1. Скачал  с http://curl.haxx.se/download.html пакет "libcurl-7.19.3-win32-ssl-msvc" с исходниками, header и lib -файлами.
2. Распаковал в папку z:\libs\cURL\libcurl-7.19.3-win32-ssl-msvc\
3. Создал в Builder 2010 проект оконного приложения.
4 Прописал в опциях
4.1
Include Path=Z:\libs\cURL\libcurl-7.19.3-win32-ssl-msvc\include
Тут лежат header-файлы

Код

include
│   Makefile.am
│   Makefile.in
│   README
│   
└───curl
        curl.h
        curlbuild.h
        curlbuild.h.in
        curlrules.h
        curlver.h
        easy.h
        Makefile.am
        Makefile.in
        mprintf.h
        multi.h
        stdcheaders.h
        typecheck-gcc.h
        types.h



4.2
Libraty Path = Z:\libs\cURL\libcurl-7.19.3-win32-ssl-msvc\lib\Debug

Код

lib
│   
├───Debug
│       curllib.dll
│       curllib.lib
│       curllib_static.lib
│       
└───Release
        curllib.dll
        curllib.lib
        curllib_static.lib



5. Использую библиотеку из модуля формы
Код

#include <curl\curl.h>
#include <curl\types.h>
#include <curl\easy.h>

void __fastcall TfrmMain::BitBtn1Click(TObject *Sender) {
    CURL *curl;
    CURLcode res;

    struct FtpFile ftpfile = {
        "curl.tar.gz", // name to store the file as if succesful
        NULL
    };

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();
    if (curl) {
        // You better replace the URL with one that works!
        curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/pub/www/utilities/curl/curl-7.9.2.tar.gz");
        // Define our callback to get called when there's data to be written
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
        // Set a pointer to our struct to pass to the callback
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);

        // Switch on full protocol/debug output
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

        res = curl_easy_perform(curl);

        // always cleanup
        curl_easy_cleanup(curl);

        if (CURLE_OK != res) {
            // we failed
            fprintf(stderr, "curl told us %d\n", res);
        }
    }

    if (ftpfile.stream) {
        // close the local file
        fclose(ftpfile.stream);
    }

    curl_global_cleanup();
}



6. При попытке компиляции ругается матом
Код

[ILINK32 Error] Error: Unresolved external '_curl_global_init' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_easy_init' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_easy_setopt' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_easy_perform' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_easy_cleanup' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_global_cleanup' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unable to perform link



7. Добавил в проект файл "Z:\LIBS\CURL\LIBCURL-7.19.3-WIN32-SSL-MSVC\LIB\DEBUG\CURLLIB.LIB"
Ругается теперь так.
[ILINK32 Error] Error: 'Z:\LIBS\CURL\LIBCURL-7.19.3-WIN32-SSL-MSVC\LIB\DEBUG\CURLLIB.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

8. Сформировал утилитой Borland'а "implib.exe" из "curllib.dll"файл "curllib.lib"
Команда "c:\Program Files\Embarcadero\RAD Studio\7.0\bin\implib.exe" curllib.lib curllib.dll

и подложил его вместо заинклудженого в проекте

При попытке компиляции снова ошибки:
Код

[ILINK32 Error] Error: Unresolved external '_curl_global_init' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_easy_init' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_easy_setopt' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_easy_perform' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_easy_cleanup' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unresolved external '_curl_global_cleanup' referenced from Z:\SAMPLES\CURL\SRC\TMP\UFRMMAIN.OBJ
[ILINK32 Error] Error: Unable to perform link



Смутно подозреваю, что проблемма в формате объявления импортируемых функций.
Гуру, отзовитесь плиз.

В чем проблемма, как побороть?



УРРРАААА!!!! Поборол.
Сконвертировал lib-файл при помощи утилиты "c:\Program Files\Embarcadero\RAD Studio\7.0\bin\coff2omf.exe"
coff2omf curllib.lib curllib.OMF.lib
Получившийся "curllib.OMF.lib" подкинул вместо "z:\libs\cURL\libcurl-7.19.3-win32-ssl-msvc\lib\Debug\curllib.lib"

Компилится без ошибок.
Грызем гранит дальше.


Готовую lib приаттачил к сообщению.

Автор: ZVano 21.2.2011, 17:56
Добавляю рабочий проект CodeGear 2010  с примером загрузки файла с FTP при помощи библиотеки cURL.
Все включено в проект просто открываете "prj-gr-cURL.groupproj", компилите и запускаете.
exe ляжет в "out\" закачаный файл по-умолчанию в "swap\".

Надеюсь, кому то это сэкономит время и сбережет нервы.

Автор: yuhala 23.3.2011, 10:28
Подключить libcurl можно и проще. Он поставляется с готовым make-файлом для builder - Makefile.b32, в котором надо поправить BCCDIR.
Затем: make -f Makefile.b32 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)