Problem bei der nutzung von Libcurl



  • Hallo,
    ich versuche ein kleines Programm zu erstellen welches per httpS ein Postrequest sendet und die antwort dann ausgibt.

    nach viel Sucherei zum thema hab ich die libcurl entdeckt.

    Nun wollte ich diese benutzen, ich habe mir dazu das binary der lib runtergeladen.

    und in meiner IDE Code::Blocks eingbaut
    Ich habe in den Serach Directoris im compiler part c:\curl-7.30.0\include
    und im linker part: c:\curl-7.30.0\lib eingetragen

    in den Linker setting habe ich folgendes eingeragen:

    C: \boost_1_53_0\stage\lib\*
    C: \curl-7.30.0\lib\libcurl.a
    C: \curl-7.30.0\lib\libssl.a
    C: \GnuWin32\lib\libz.a
    C: \MinGW\lib\libwldap32.a
    C: \MinGW\lib\libws2_32.a
    C: \MinGW\lib\libwinmm.a
    C: \MinGW\lib\libgdi32.a

    der Compiler gibt mir bei einen test programm:

    #include <stdio.h>
    #include <curl/curl.h>
    
    int main(void)
    {
        CURL *curl;
        CURLcode res;
    
        curl = curl_easy_init();
        if(curl) {
            curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
            res = curl_easy_perform(curl);
    
            /* always cleanup */
            curl_easy_cleanup(curl);
        }
        return 0;
    }
    

    dieses hier aus:

    -------------- Build: Debug in test (compiler: GNU GCC Compiler)---------------

    mingw32-g++.exe -LC:\boost_1_53_0\lib -LC:\curl-7.30.0\lib -o bin\Debug\test.exe obj\Debug\main.o -static C:\boost_1_53_0\stage\lib\* C:\curl-7.30.0\lib\libcurl.a C:\curl-7.30.0\lib\libssl.a C:\GnuWin32\lib\libz.a C:\MinGW\lib\libwldap32.a C:\MinGW\lib\libws2_32.a C:\MinGW\lib\libwinmm.a C:\MinGW\lib\libgdi32.a
    C: \curl-7.30.0\lib\libcurl.a(url.o): (.text.unlikely+0x8f): undefined reference to idna\_to\_ascii_lz' C: \\curl-7.30.0\\lib\\libcurl.a(url.o): (.text.unlikely+0x96): undefined reference tostringprep_locale_charset'
    C: \curl-7.30.0\lib\libcurl.a(url.o): (.text.unlikely+0xfe): undefined reference to idna\_to\_unicode_lzlz' C: \\curl-7.30.0\\lib\\libcurl.a(url.o): (.text.unlikely+0x122): undefined reference totld_check_lz'
    C: \curl-7.30.0\lib\libcurl.a(url.o): (.text.unlikely+0x1a4): undefined reference to stringprep\_check\_version' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xe): undefined reference toBIO_s_mem'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x16): undefined reference to BIO_new' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x38): undefined reference toX509_NAME_print_ex'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x5c): undefined reference to BIO_ctrl' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x7c): undefined reference toBIO_free'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xbd): undefined reference to X509\_STORE\_CTX\_get\_current_cert' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xc5): undefined reference toX509_get_subject_name'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x5db): undefined reference to ERR\_clear\_error' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x6a6): undefined reference toERR_get_error'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x6b6): undefined reference to ERR\_error\_string' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x9a8): undefined reference toERR_clear_error'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xa2e): undefined reference to ERR\_get\_error' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xa47): undefined reference toERR_error_string'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xaa2): undefined reference to sk_num' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xabe): undefined reference tosk_num'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xadc): undefined reference to sk_value' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xae3): undefined reference toBIO_s_mem'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xaeb): undefined reference to BIO_new' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xaff): undefined reference toX509_EXTENSION_get_object'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xb17): undefined reference to i2t\_ASN1\_OBJECT' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xb1f): undefined reference toX509_EXTENSION_get_critical'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xb6c): undefined reference to X509V3\_EXT\_print' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xb98): undefined reference toBIO_ctrl'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xc24): undefined reference to BIO_free' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xca0): undefined reference toASN1_STRING_print'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xd40): undefined reference to X509\_get\_subject_name' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xd6b): undefined reference toX509_free'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xdf8): undefined reference to sk_num' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xe6d): undefined reference tosk_value'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xe79): undefined reference to X509\_get\_subject_name' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xec6): undefined reference toX509_get_issuer_name'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0xf0f): undefined reference to ASN1\_INTEGER\_get' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0xf6d): undefined reference toX509_get_serialNumber'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x100e): undefined reference to i2t\_ASN1\_OBJECT' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x10f4): undefined reference toi2t_ASN1_OBJECT'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x1134): undefined reference to X509\_get\_pubkey' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x1163): undefined reference toEVP_PKEY_free'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x1192): undefined reference to BIO\_s\_mem' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x119a): undefined reference toBIO_new'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x11ac): undefined reference to PEM\_write\_bio_X509' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x11cc): undefined reference toBIO_ctrl'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x1215): undefined reference to BIO_free' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x1345): undefined reference toX509_get_ext_d2i'
    C: \curl-7.30.0\lib\libcurl.a(ssluse.o): (.text+0x1359): undefined reference to sk_num' C: \\curl-7.30.0\\lib\\libcurl.a(ssluse.o): (.text+0x1393): undefined reference tosk_value'
    Process terminated with status 1 (0 minutes, 34 seconds)
    50 errors, 0 warnings (0 minutes, 34 seconds)

    es klappt nicht...

    da ich in c++ jetzt noch nicht so bewandert bin weiss ich auch nicht ob curl die beste Lösung für die gegebene Problemstellung ist.

    Gruß
    <-


  • Mod

    Googeln deiner Fehlermeldung ergibt, dass libcurl noch die libidn benötigt, die hier aber nicht mit gelinkt wird.



  • ich habe mir die libidn nun noch heruntergeladen und nach selbigen verfahren gelink, aber das resultat ist das selbe



  • Da fehlt noch OpenSSL



  • der fehler log ist nun wesentlich kürzer

    -------------- Build: Debug in test (compiler: GNU GCC Compiler)---------------

    mingw32-g++.exe -LC:\boost_1_53_0\lib -LC:\libidn\lib -LC:\OpenSSL-Win64\lib -LC:\curl-7.30.0\lib -o bin\Debug\test.exe obj\Debug\main.o C:\MinGW\lib\libws2_32.a C:\boost_1_53_0\stage\lib\* C:\curl-7.30.0\lib\libcurl.a C:\OpenSSL-Win64\lib\libeay32.lib C:\OpenSSL-Win64\lib\ssleay32.lib C:\GnuWin32\lib\libz.a C:\MinGW\lib\libwldap32.a C:\MinGW\lib\libwinmm.a C:\MinGW\lib\libgdi32.a C:\libidn\lib\libidn.a
    obj\Debug\main.o: In function main': C:/Users/Seb/Documents/test/main.cpp:10: undefined reference to_imp__curl_easy_init'
    C:/Users/Seb/Documents/test/main.cpp:12: undefined reference to \_imp\_\_curl\_easy\_setopt' C:/Users/Seb/Documents/test/main.cpp:13: undefined reference to_imp__curl_easy_perform'
    C:/Users/Seb/Documents/test/main.cpp:16: undefined reference to `_imp__curl_easy_cleanup'
    collect2: ld gab 1 als Ende-Status zurück
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 0 warnings (0 minutes, 0 seconds)

    wenn ich aber nun ein open ssl test machen möchte

    #include <openssl/applink.c> // To prevent crashing (see the OpenSSL FAQ)
    #include <openssl/bio.h> // BIO objects for I/O
    #include <openssl/ssl.h> // SSL and SSL_CTX for SSL connections
    #include <openssl/err.h> // Error reporting
    
    #include <stdio.h> // If you don't know what this is for stop reading now.
    
    void openssltest(void);
    
    int main(int argc, char** argv) {
       CRYPTO_malloc_init(); // Initialize malloc, free, etc for OpenSSL's use
       SSL_library_init(); // Initialize OpenSSL's SSL libraries
       SSL_load_error_strings(); // Load SSL error strings
       ERR_load_BIO_strings(); // Load BIO error strings
       OpenSSL_add_all_algorithms(); // Load all available encryption algorithms
    
       openssltest(); // We'll define this later.
    
       return 0;
    }
    

    gibt der sachen wie

    -------------- Build: Debug in test (compiler: GNU GCC Compiler)---------------

    mingw32-g++.exe -Wall -fexceptions -g -IC:\boost_1_53_0 -IC:\libidn\include -IC:\OpenSSL-Win64\include -IC:\curl-7.30.0\include -c C:\Users\Seb\Documents\test\main.cpp -o obj\Debug\main.o
    In file included from C:\Users\Seb\Documents\test\main.cpp:22:0:
    C:\OpenSSL-Win64\include/openssl/applink.c: In Funktion »void** OPENSSL_Applink()«:
    C:\OpenSSL-Win64\include/openssl/applink.c:60:45: Fehler: ungültige Umwandlung von »void* ()()« in »void« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:61:41: Fehler: ungültige Umwandlung von »void* ()()« in »void« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:62:41: Fehler: ungültige Umwandlung von »void* ()()« in »void« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:63:42: Fehler: ungültige Umwandlung von »int ()(FILE, const char*, ...) {aka int ()(_iobuf, const char*, ...)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:64:40: Fehler: ungültige Umwandlung von »char* ()(char, int, FILE*) {aka char* ()(char, int, _iobuf*)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:65:40: Fehler: ungültige Umwandlung von »size_t ()(void, size_t, size_t, FILE*) {aka unsigned int ()(void, unsigned int, unsigned int, _iobuf*)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:66:41: Fehler: ungültige Umwandlung von »size_t ()(const void, size_t, size_t, FILE*) {aka unsigned int ()(const void, unsigned int, unsigned int, _iobuf*)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:67:42: Fehler: ungültige Umwandlung von »int ()(FILE, char) {aka int ()(_iobuf, char)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:68:39: Fehler: ungültige Umwandlung von »int ()(FILE) {aka int ()(_iobuf)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:69:41: Fehler: ungültige Umwandlung von »int ()(FILE) {aka int ()(_iobuf)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:71:40: Fehler: ungültige Umwandlung von »FILE* ()(const char, const char*) {aka _iobuf* ()(const char, const char*)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:72:40: Fehler: ungültige Umwandlung von »int ()(FILE, long int, int) {aka int ()(_iobuf, long int, int)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:73:40: Fehler: ungültige Umwandlung von »long int ()(FILE) {aka long int ()(_iobuf)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:74:41: Fehler: ungültige Umwandlung von »int ()(FILE) {aka int ()(_iobuf)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:75:41: Fehler: ungültige Umwandlung von »int ()(FILE) {aka int ()(_iobuf)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:76:43: Fehler: ungültige Umwandlung von »void ()(FILE) {aka void ()(_iobuf)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:77:41: Fehler: ungültige Umwandlung von »int ()(FILE) {aka int ()(_iobuf)}« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:79:39: Fehler: ungültige Umwandlung von »int ()(const char, int, ...)« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:80:39: Fehler: ungültige Umwandlung von »int ()(int, void, unsigned int)« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:81:40: Fehler: ungültige Umwandlung von »int ()(int, const void, unsigned int)« in »void*« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:82:40: Fehler: ungültige Umwandlung von »long int ()(int, long int, int)« in »void« [-fpermissive]
    C:\OpenSSL-Win64\include/openssl/applink.c:83:40: Fehler: ungültige Umwandlung von »int ()(int)« in »void« [-fpermissive]
    Process terminated with status 1 (0 minutes, 0 seconds)
    22 errors, 0 warnings (0 minutes, 0 seconds)

    aus, ich das gefühl da ist etwas sehr faul


  • Mod

    seb-eisdrache schrieb:

    der fehler log ist nun wesentlich kürzer

    Link mal gegen die curl DLL, nicht gegen die statische Library.

    wenn ich aber nun ein open ssl test machen möchte
    [...]
    aus, ich das gefühl da ist etwas sehr faul

    Hast du einfach den Quellcode von OpenSSL deinem Projekt zugefügt? Das geht natürlich nicht. Der offensichtlichste Grund dafür ist, dass OpenSSL in C geschrieben ist und daher nicht mit einem C++-Compiler übersetzt werden kann. Du musst OpenSSL erst einmal bauen und dann die dabei erstellte Bibliothek benutzen.



  • Ich habe open ssl noch nicht selbst kompeliert, aber wenn ich nun das programm starte und mit einen https beispiel http://curl.haxx.se/libcurl/c/https.html teste mit google bekomme ich folgendes;

    curl_easy_perform() failed: Peer certificate cannot be authenticated with given
    CA certificates


  • Mod

    Dir ist schon klar, dass https://example.com nur ein Beispiel ist, oder?



  • ja... deswegen hab ich auch www.google.de dort eingegeben


  • Mod

    Dann kann ich dir nicht mehr weiter helfen, denn bei mir funktioniert es und googeln kannst du selber. Von der Fehlermeldung her ist wohl irgendetwas falsch konfiguriert. Ich verschiebe dich mal, da das ein sehr allgemeines Problem ist, das alle Nutzer von libcurl kennen könnten, nicht bloß C++-spezifisch.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • soo

    ich habe weiter rumgewerkelt...

    ich habe libcurl nun mit dem windows nativen ssl mit hilfe von visiual studio express komepeliert und die lib dann in code::blocks eingebunden.
    Funktioniert auch soweit, nur stürzt das programm beim clean_up ab.



  • ich konnte lib curl nun mit hilfe von: http://code.google.com/p/twitcurl/wiki/WikiCompileMinGWWindows mit MinGw kompelieren, allerdings hab ich folgende optionen gesetzt:
    $ configure --with-winssl --with-winidn --enable-ipv6

    nur leider stürzt mein programm immer bei curl_easy_cleanup() ab.

    konnte leider keinen lösungsansatz bisher finden...



  • ich habe nun versucht die libcurl als statische lib zu kompelieren. Laut google kann dies die abstürze beheben.

    aber egal was ich versuche ich bekomme immer (Code::Blocks):

    -------------- Build: Debug in test (compiler: GNU GCC Compiler)---------------
    
    mingw32-g++.exe -LC:\boost_1_53_0\lib -LC:\curl\lib  -o bin\Debug\test.exe obj\Debug\main.o   -static-libgcc -static-libstdc++  C:\boost_1_53_0\stage\lib\* C:\curl\lib\libcurl.a C:\MinGW\lib\libws2_32.a 
    obj\Debug\main.o:main.cpp:(.text+0xf6): undefined reference to `_imp__curl_global_init'
    obj\Debug\main.o:main.cpp:(.text+0x10c): undefined reference to `_imp__curl_easy_init'
    obj\Debug\main.o:main.cpp:(.text+0x145): undefined reference to `_imp__curl_easy_setopt'
    obj\Debug\main.o:main.cpp:(.text+0x169): undefined reference to `_imp__curl_easy_setopt'
    obj\Debug\main.o:main.cpp:(.text+0x18a): undefined reference to `_imp__curl_easy_setopt'
    obj\Debug\main.o:main.cpp:(.text+0x1ae): undefined reference to `_imp__curl_easy_setopt'
    obj\Debug\main.o:main.cpp:(.text+0x1bf): undefined reference to `_imp__curl_easy_perform'
    obj\Debug\main.o:main.cpp:(.text+0x1e1): undefined reference to `_imp__curl_easy_strerror'
    obj\Debug\main.o:main.cpp:(.text+0x333): undefined reference to `_imp__curl_easy_cleanup'
    obj\Debug\main.o:main.cpp:(.text+0x33a): undefined reference to `_imp__curl_global_cleanup'
    collect2: ld gab 1 als Ende-Status zurück
    Process terminated with status 1 (0 minutes, 4 seconds)
    10 errors, 0 warnings (0 minutes, 4 seconds)
    


  • Hast du auch CURL_STATICLIB definiert?



  • irgendwie scheint mit die IDE langasm etwas suspekt... ich hatte es vorher auch immer angegeben bei den #defines aber nun scheint er es kapiert zu haben.

    also er hat ohne zu mekern kompeliert.

    Aber leider hat dies immer ncoh nicht den absturz bei dem "curl_easy_cleanup(curl);" befehl behoben.


Anmelden zum Antworten