000
05.04.2020, 14:28 Uhr
Merkaber
|
Hallo liebe community,
ich bastel schon laenger an einem projekt mit libcurl auf linux.
Auf Windows kriege ich es einfach nicht zum laufen. Ursache ist anscheinend das statische linken mit libcurl oder die Installation an sich.
Folgende environment habe ich.
MSYS64 mit mingw64 und g++ als compiler und cmake als build tool. libcurl habe ich von https://curl.haxx.se/download.html als precombiled binary geladen, entpackt und in einen ordner geschoben, wie man unten gleich sehen kann.
CMakeText.txt sieht wie folgt aus:
Code: |
cmake_minimum_required(VERSION 3.15) project(testlib)
set(CMAKE_CXX_STANDARD 14)
add_definitions(-DCURL_STATICLIB)
set(CURL_LIBRARY C:\\Users\\Merkaber\\Documents\\dev\\libraries\\curl-7.69.0-win64-mingw\\lib) set(CURL_INCLUDE_DIR C:\\Users\\Merkaber\\Documents\\dev\\libraries\\curl-7.69.0-win64-mingw\\include) find_package(CURL REQUIRED) include_directories(${CURL_INCLUDE_DIRS}) link_directories(${CURL_LIBRARIES})
find_package(Threads REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} curl Threads::Threads dl wldap32 ws2_32)
|
Wenn ich nun mein kleines Programm (einfacher download von website) aufrufe, dann finished das Programm sofort mit exit code: -1073741515 (0xC0000135)
Das builden klappt ohne Probleme. Anscheinend will libcurl auf eine dll zugreifen (soweit ich den Fehlercode richtig interpretiere). Jedoch verstehe ich nicht, wie ich libcurl dann installieren soll, damit die dll vorhanden ist. Eigentlich moechte ich ja libcurl nur statisch nutzen, mir waere aber auch eine "Installationsanleitung" recht, die einfach step by step funktioniert, sodass ich endlich mit libcurl linken kann.
Hier das kleine Testprogramm fuer curl.
Code: |
#include <iostream>
#include "curl/curl.h"
static size_t write_memory_callback(void* contents, size_t size, size_t nmemb, void* userp);
struct MemoryStruct { char* memory; size_t size; };
int main() { std::string download_response; bool curl_response = false;
CURL* curl; CURLcode res;
struct MemoryStruct chu; chu.memory = (char*) malloc(1); chu.size = 0;
// Handle winsock stuff curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.com/"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_memory_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*) &chu);
res = curl_easy_perform(curl); if (res != CURLE_OK) { curl_response = false; fprintf(stderr, "curl_easy_perform() failed: %s \n", curl_easy_strerror(res)); } else { long responseCode; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode); if (responseCode == 200) { curl_response = true; download_response = std::string(chu.memory); } } curl_easy_cleanup(curl); } curl_global_cleanup();
std::cout << download_response << std::endl;
return 0; }
static size_t write_memory_callback(void *contents, size_t size, size_t nmemb, void *userp) { size_t real_size = size * nmemb; struct MemoryStruct* mem = (struct MemoryStruct*) userp;
char* ptr = (char*) realloc(mem->memory, mem->size + real_size + 1); if(ptr == nullptr) { printf("not enough memory\n"); return 0; }
mem->memory = ptr; memcpy(&(mem->memory[mem->size]), contents, real_size); mem->size += real_size; mem->memory[mem->size] = 0;
return real_size; }
|
PS: Vielleicht weiss jemand, wie ich precombiled binaries mit MSYS64 downloaden kann, sodass find_package(curl) auch funktioniert. Wichtig ist allerdings, dass OpenSSL unterstuetzt, was anscheinend auch ein riesen Problem ist. (Ich kriege die Krise)
Jede Hilfe ist willkommen, da weder StackOverflow noch andere Webseiten hinweis darauf geben, was bei mir falsch laeuft. |