Wie libcurl richtig benutzen ?
-
Hi,
wollte ein bisschen mit libcurl rumspielen.
Habe mir dafür die letzte curl Version heruntergeladen.
Habe die Lib erstellt mit den Visual Studio CMD Tools:Set RTLIBCFG=static nmake /f Makefile.vc mode=static MACHINE=x86 DEBUG=no
Das hat auch super funktioniert.
Anschließend habe ich die jeweiligen Verzeichnisse (Lib, Include) bei mir in den Projekteinstellungen hinterlegt (zusätzliche Include,Lib Verzeichnisse).Wollte dann folgenden example Code testen:
#include <stdio.h> #include "include/curl/curl.h" #pragma comment(lib, "libcurl_a.lib") /* This is a simple example showing how to list the folders within an IMAP * mailbox. * * Note that this example requires libcurl 7.30.0 or above. */ int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL *curl = curl_easy_init(); if (curl) { CURLcode res; curl_easy_setopt(curl, CURLOPT_URL, "http://www.dynamsoft.com"); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } curl_global_cleanup(); printf("Press any key to continue\n"); getchar(); return 0; }
Bekomme aber beim kompilieren die folgenden Fehler angezeigt:
1>c:\temp\libcurl_Test\main.c(42): error C2275: 'CURL': Ungültige Verwendung dieses Typs als Ausdruck
1> c:\libcurl\include\curl\curl.h(102): Siehe Deklaration von 'CURL'
1>c:\temp\libcurl_Test\main.c(42): error C2065: 'curl': nichtdeklarierter Bezeichner
1>c:\temp\libcurl_Test\main.c(42)(43): error C2065: 'curl': nichtdeklarierter Bezeichner
1>c:\temp\libcurl_Test\main.c(42)(45): error C2065: 'curl': nichtdeklarierter Bezeichner
1>c:\temp\libcurl_Test\main.c(42)(45): warning C4022: 'curl_easy_setopt': Zeigertyp für übergebenen Parameter 1 stimmt nicht mit dem deklarierten Zeigertyp überein
1>c:\temp\libcurl_Test\main.c(42)(46): error C2065: 'curl': nichtdeklarierter Bezeichner
1>c:\temp\libcurl_Test\main.c(42)(46): warning C4022: 'curl_easy_perform': Zeigertyp für übergebenen Parameter 1 stimmt nicht mit dem deklarierten Zeigertyp überein
1>c:\temp\libcurl_Test\main.c(42)(47): error C2065: 'curl': nichtdeklarierter Bezeichner
1>c:\temp\libcurl_Test\main.c(42)(47): warning C4022: 'curl_easy_cleanup': Zeigertyp für übergebenen Parameter 1 stimmt nicht mit dem deklarierten Zeigertyp übereinWas habe ich den falsch gemacht, habe doch nur das example testen wollen.
-
Die Zeilennummer in der Fehlermeldung (main.c(42)) paßt nicht mit deinem geposteten Code überein.
Hast du CURL selber als Makro (oder ähnliches) deklariert?
-
Das sieht doch schon mal falsch aus: #include "include/curl/curl.h"
Es sollte so eingerichtet werden, dass "#include <curl/curl.h>" genutzt werden kann.
-
Th69 schrieb:
Die Zeilennummer in der Fehlermeldung (main.c(42)) paßt nicht mit deinem geposteten Code überein.
Hast du CURL selber als Makro (oder ähnliches) deklariert?Sorry hätte vielleicht die Kommentare in dem Fall kopieren sollen:
/*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.haxx.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is * furnished to do so, under the terms of the COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ***************************************************************************/ /* <DESC> * IMAP example to list the folders within a mailbox * </DESC> */ #include <stdio.h> #include "curl/curl.h" #pragma comment(lib, "libcurl_a.lib") /* This is a simple example showing how to list the folders within an IMAP * mailbox. * * Note that this example requires libcurl 7.30.0 or above. */ int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL *curl = curl_easy_init(); if (curl) { CURLcode res; curl_easy_setopt(curl, CURLOPT_URL, "http://www.dynamsoft.com"); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } curl_global_cleanup(); printf("Press any key to continue\n"); getchar(); return 0; }
Winfried not WinFreak schrieb:
Das sieht doch schon mal falsch aus: #include "include/curl/curl.h"
Es sollte so eingerichtet werden, dass "#include <curl/curl.h>" genutzt werden kann.
Habe nun die Includeverzeichnisse ergänzt um "C:\libcurl\include".
Trotzdem habe ich noch die gleichen Fehler
-
https://stackoverflow.com/questions/9903582/error-c2275-illegal-use-of-this-type-as-an-expression
In .cpp umbenennen oder die zweite Zeile in der main nach oben verschieben.
-
Ach ja, VS kann ja kein C99.
-
konj schrieb:
https://stackoverflow.com/questions/9903582/error-c2275-illegal-use-of-this-type-as-an-expression
In .cpp umbenennen oder die zweite Zeile in der main nach oben verschieben.
Das funktioniert, nur bekomme ich komischerweise jetzt wieder Probleme mit dem Linker:
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_global_cleanup" in Funktion "_main".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_cleanup" in Funktion "_main".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_perform" in Funktion "_main".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_setopt" in Funktion "_main".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_init" in Funktion "_main".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_global_init" in Funktion "_main".
1>C:\Temp\libcurl_Test\Debug\libcurl_Test.exe : fatal error LNK1120: 6 nicht aufgelöste externe Verweise.
-
Wo liegt denn die "libcurl_a.lib"? Evtl. noch den Pfad dazu angeben (oder in den Linker-Einstellungen).
-
Th69 schrieb:
Wo liegt denn die "libcurl_a.lib"? Evtl. noch den Pfad dazu angeben (oder in den Linker-Einstellungen).
Diese liegt ebenfalls unter:
C:\libcurl\libDen Pfad habe ich aber bereits unter "Bibliotheksverzeichnisse" hinzugefügt.
-
Funktioniert es denn, wenn du den Pfad direkt beim #pragma comment hinzufügst?
Oder erhältst du eine Warnung (evtl. Warn-Level erhöhen)?
-
Th69 schrieb:
Funktioniert es denn, wenn du den Pfad direkt beim #pragma comment hinzufügst?
Oder erhältst du eine Warnung (evtl. Warn-Level erhöhen)?Ironischerweise, nein.
Beim Build der lib hat er mir keine Fehler gebracht.
Ich habe es gefühl ich werde noch doof, wollte mir nur mal paar Sachen mit libcurl anschauen und nun bin ich schon Stunden damit beschäftigt
-
Du musst in den Projekteinstellungen CURL_STATICLIB definieren, wenn du diese Bibliothek statisch linken möchtest (Project->Properties->C/C++->Preprocessor->Preprocessor Definitions und dort eben CURL_STATICLIB; einfügen).
-
yahendrik schrieb:
Du musst in den Projekteinstellungen CURL_STATICLIB definieren, wenn du diese Bibliothek statisch linken möchtest (Project->Properties->C/C++->Preprocessor->Preprocessor Definitions und dort eben CURL_STATICLIB; einfügen).
Genau das hat alles behoben !
Vielen Dank !
-
Leider muss ich das Thema nochmal pushen.
Also mit Libcurl ansich funktioniert nun alles!
Wenn ich aber mit den Libcurl Funktionen in Verbindung mit _beginthreadex() arbeiten will, bekomme ich Fehler beim erstellen.
Mir ist bekannt das ich für _beginthreadex() die Laufzeitbibliothek auf "Multithreaded" setzen muss.
Das habe ich getan und bekomme nun beim erstellen ganz viele Fehler vom Linker.Kann ich libcurl etwas nicht in Verbindung mit _beginthreadex() nutzen ?
-
Dieses Problem tritt aber nur auf wenn mein Projekt im Debugmodus ist.
Release funktioniert alles.