Libcurl unter Windows in CLion



  • Abend,

    ich versuche unter Windows in CLion libcurl zum laufen zu bringen.
    Folgenderweise bin ich vorgegangen:

    1. Download von libcurl von https://curl.haxx.se/windows/dl-7.70.0/curl-7.70.0-win32-mingw.zip
    2. Entpackt und bei mir nach "C:\Development-Tools\libcurl" kopiert

    Danach folgendes Beispielprogramm zum testen verwendet und die CMakelist angepasst:

    #include <cstdio>
    #include "iostream"
    #include <curl/curl.h>
    
    static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
        ((std::string*)userp)->append((char*)contents, size * nmemb);
        return size * nmemb;
    }
    
    int main(void)
    {
        CURL *curl;
        CURLcode res;
        std::string readBuffer;
    
        curl = curl_easy_init();
        if(curl) {
            curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com");
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
            res = curl_easy_perform(curl);
            curl_easy_cleanup(curl);
    
            std::cout << readBuffer << std::endl;
        }
        return 0;
    }
    
    cmake_minimum_required(VERSION 3.14)
    project(CURL)
    
    set(CMAKE_CXX_STANDARD 17)
    
    set(libcurl_INCLUDE_DIR "C:/Development-Tools/libcurl/include")
    include_directories(${libcurl_INCLUDE_DIR})
    
    add_executable(CURL main.cpp)
    
    target_link_libraries(CURL C:/Development-Tools/libcurl/lib/libcurl.dll.a)
    

    Allerdings bekomme ich immer folgende Meldung.

    CMakeFiles\CURL.dir/objects.a(main.cpp.obj): In function `main':
    C:/Development/CLion/CURL/main.cpp:18: undefined reference to `curl_easy_init'
    C:/Development/CLion/CURL/main.cpp:20: undefined reference to `curl_easy_setopt'
    C:/Development/CLion/CURL/main.cpp:21: undefined reference to `curl_easy_setopt'
    C:/Development/CLion/CURL/main.cpp:22: undefined reference to `curl_easy_setopt'
    C:/Development/CLion/CURL/main.cpp:23: undefined reference to `curl_easy_perform'
    C:/Development/CLion/CURL/main.cpp:24: undefined reference to `curl_easy_cleanup'
    collect2.exe: error: ld returned 1 exit status
    mingw32-make.exe[3]: *** [CMakeFiles\CURL.dir\build.make:87: CURL.exe] Error 1
    mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:75: CMakeFiles/CURL.dir/all] Error 2
    mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/CURL.dir/rule] Error 2
    mingw32-make.exe: *** [Makefile:117: CURL] Error 2
    

    Kann mir jemand sagen was falsch ist?



  • Was soll der C++ Müll im pure curl-Code?



  • Beim statischen Linken von libCurl muss imho CURL_STATICLIB definiert sein.



  • Habe meiner CMakelist folgenden Befehl hinzugefügt

    add_definitions( -DCURL_STATICLIB )
    

    Leider bekomme ich weiterhin die oben genannten Fehler



  • Für das Einbinden der statischen Lib benötigst du libcurl.a (nicht libcurl.dll.a).
    Anderseits sollte es auch mit dem dynamischen Linken so funktionieren. Paßt denn der Pfad zu der libcurl.dll.a? Evtl. den ganzen Pfad in Anführungsstriche setzen?
    Oder alternativ link_directories(...) passend setzen und dann nur den Lib-Namen in target_link_libraries(...) benutzen.



  • @Th69 sagte in Libcurl unter Windows in CLion:

    link_directories

    habe meine CMakelist jetzt wie folgt angepasst

    cmake_minimum_required(VERSION 3.14)
    project(CURL)
    
    set(CMAKE_CXX_STANDARD 17)
    
    set(libcurl_INCLUDE_DIR "C:/Development-Tools/libcurl/include")
    include_directories(${libcurl_INCLUDE_DIR})
    link_directories(C:/Development-Tools/libcurl/lib/)
    
    add_definitions( -DCURL_STATICLIB )
    add_executable(CURL main.cpp)
    
    target_link_libraries(CURL libcurl.a)
    

    Pfade geprüft. Bekomme aber nun folgenden Fehler...

    C:/Development-Tools/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/Development-Tools/libcurl/lib\libcurl.a when searching for -lcurl
    C:/Development-Tools/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lcurl
    collect2.exe: error: ld returned 1 exit status
    mingw32-make.exe[3]: *** [CMakeFiles\CURL.dir\build.make:86: CURL.exe] Error 1
    mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:75: CMakeFiles/CURL.dir/all] Error 2
    mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/CURL.dir/rule] Error 2
    mingw32-make.exe: *** [Makefile:117: CURL] Error 2
    


  • @swoopo sagte in Libcurl unter Windows in CLion:

    set(libcurl_INCLUDE_DIR "C:/Development-Tools/libcurl/include")
    include_directories(${libcurl_INCLUDE_DIR})
    link_directories(C:/Development-Tools/libcurl/lib/)

    Normalerweise solltest du libcurl so finden: https://cmake.org/cmake/help/latest/module/FindCURL.html und nicht manuell Dinge aufsetzen.

    Edit: ach Mist, ggf. funktionier das auf Windows so nicht ohne weiteres. Man muss wohl noch -DCURL_LIBRARY=<curl_lib_path> -DCURL_INCLUDE_DIR=<curl_include_path> angeben.



  • Entschuldige für meine späte Antwort.

    Egal was ich mache ich bekomme immer die oben genannten Fehler.

    Zwischenzeitlich hab ich libcurl neu, nach folgender Anleitung bzw. nach dieser, gebuildet was allerdings auch zu keinen Erfolg führte und auch nur die oben genannten Fehler brachte...

    So langsam bin ich am verzweifeln,



  • Kannst du mal den Verbose-Modus beim CMake einstellen: Using CMake with GNU Make: How can I see the exact commands?, und dann die gccKommandos dir anschauen (ob sie korrekt sind).

    Oder du prüfst mal, ob du das Linken ohne CMake hinbekommst, d.h. den gcc von Hand aufrufst:

    gcc main.cpp -IC:/Development-Tools/libcurl/include -LC:/Development-Tools/libcurl/lib -lcurl.dll
    

    bzw.

    gcc main.cpp -DCURL_STATICLIB -I... -L... -lcurl
    

Log in to reply