Probleme mit Curl in VC++ 9
-
Hallo erstmal.
Das Problem ist, dass der Linker aus irgendeinem Grund die Fehlermeldung ausgibt:
error LNK2001: Nicht aufgelöstes externes Symbol "__imp__curl_easy_init"
fatal error LNK1120: 1 nicht aufgelöste externe Verweise.In den FAQ auf der Curl seite ist diese Problem beschrieben, jedoch funktioniert es auch nicht, oder ich mache was falsch.
Hier der Auszug aus der FAQ
5.7 Link errors when building libcurl on Windows!
You need to make sure that your project, and all the libraries (both static
and dynamic) that it links against, are compiled/linked against the same run
time library.This is determined by the /MD, /ML, /MT (and their corresponding /M?d)
options to the command line compiler. /MD (linking against MSVCRT dll) seems
to be the most commonly used option.When building an application that uses the static libcurl library, you must
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
dynamic import symbols. If you get linker error like "unknown symbol
__imp__curl_easy_init ..." you have linked against the wrong (static)
library. If you want to use the libcurl.dll and import lib, you don't need
any extra CFLAGS, but use one of the import libraries below. These are the
libraries produced by the various lib/Makefile.* files:Target: static lib. import lib for libcurl*.dll.
-----------------------------------------------------------
MingW: libcurl.a libcurldll.a
MSVC (release): libcurl.lib libcurl_imp.lib
MSVC (debug): libcurld.lib libcurld_imp.lib
Borland: libcurl.lib libcurl_imp.libIn den Optionen von VC hab ich unter Verzeichnis, bei Include "C:\libcurl\include" und bei Bibliothek "C:\libcurl\lib" angegeben, so wie es mehrere Anleitungen die ich gefunden habe beschreiben. Dann bei den Projekteigenschaften dem Linker noch die Zusätliche Bibliothek "libcurl.lib libcurl_imp.lib" angegeben.
Ich dachte erst es liegt an curl selbst, und es dann neu heruntergeladen und neu erstellt mit VC. Es hat jedoch nichts geholfen.
Aja, der Code der den Linkerfehler verursacht:
#ifndef _curlload_h #define _curlload_h #include <stdio.h> #include <curl/curl.h> CURL* curl = curl_easy_init(); #endif
Ich weis langsam echt nicht mehr weiter
-
Du programmierst in C, hast ein Problem mit dem MSVC und gehst ins ISO C++ Forum? Wie du auf diese Idee gekommen bist, würde mich mal interessieren *lol*
Zu deinem Problem:
Hast du darauf geachtet, die Debug Libraries und Release Libraries richtig zu linken?
Hast du darauf geachtet, bei CURL und bei deinem Projekt die CRT gleich zu linken?Grüssli
-
Nein, ich programmiere in C++, das stdio.h hab ich nur direkt mit nem beispielcode eingefügt, um zu überprüfen ob es überhaupt funktioniert.
Hast du darauf geachtet, die Debug Libraries und Release Libraries richtig zu linken?
Ich hab für die debuglibaries libcurld.lib libcurld_imp.lib und für die Release libcurl.lib libcurl_imp.lib.
Hast du darauf geachtet, bei CURL und bei deinem Projekt die CRT gleich zu linken?
Ehm, nein, es war bisher nie notwendig ne bibliothek so einzufügen da ich es nie gebraucht habe. Mach das ja nur hobbymäßig.
Aber erkläre mir wie, dann überprüfe ich das.
-
Neo Gandar schrieb:
Nein, ich programmiere in C++, das stdio.h hab ich nur direkt mit nem beispielcode eingefügt, um zu überprüfen ob es überhaupt funktioniert.
Dann nimm aber bitte <cstdio>
Aber auch wenn du C++ programmierst, dies ist ein MSVC Problem und hat mit C++ nichts zu tun.Neo Gandar schrieb:
Ehm, nein, es war bisher nie notwendig ne bibliothek so einzufügen da ich es nie gebraucht habe. Mach das ja nur hobbymäßig.
Aber erkläre mir wie, dann überprüfe ich das.
Unter den Projekteigenschaften:
Configuration Propertiers -> C/C++ -> Code Generation -> Runtime-LibraryDa hast du die Auswahl zwischen MT, MTd, MD oder MDd. In der Bibliothek wie auch dem Programm muss die gleiche Einstellung sein, sonst kann es zu Linkerfehlern kommen.
Grüssli
-
In der Bibliothek und im Programm is jeweils /MD angegeben.
Dann nimm aber bitte <cstdio>
Ok
#Edit
Dann bitte ich um eine Verschiebung von diesem Thema in den Bereich
-
Und auf das erwähnte
DCURL_STATICLIB
hast du auch geachtet?Grüssli
-
Nein hab ich nicht, da ich ned finden konnte wo ich das setzten soll
-
Das ist nichts anderes als ein Präprozessor flag. Aber wieso fragst du das nicht gleich? Wenn du statisch linkst und dies nicht beachtet hast, dann steht ja explizit, dass es zu Fehlern kommt.
Unter den Projekteigenschaften:
Configuration Propertiers -> C/C++ -> Preprocessor -> Preprocessor DefinitionsDort fügst du DCURL_STATICLIB ein. Wenn schon etwas dort steht, dann verwende das Semikolon um die Einträge zu trennen oder klicke auf "..." dahinter und füge es in einer neuen Zeile dazu, dann wird die Trennung automatisch gemacht.
Grüssli
-
Hab es eingefügt, aber die Fehlermeldung bleibt die gleiche....
#EDIT
Hab jetz paar dinge versucht zu ändern, und jetz bekomm ich ne neue Fehlermeldung, die alte erscheint nicht mehr.
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_init" in Funktion ""void __cdecl `dynamic initializer for 'curl''(void)" (??__Ecurl@@YAXXZ)".
-
libcurl.lib <-- Stem for static libs
libcurl_imp.lib <-- Stem for DLL import libsBeides zu linken ist quatsch. Entweder linkst du curl statisch mit der ersten .lib und setzt die Präprozessor Flagge DCURL_STATICLIB oder linkst _impl.lib und benutzt die libcurl.dll
Wenn Du deine Anwendung statisch zu crt linkst (MT) musst du auch curl mit MT erstellen (http://www.doxapp.com/code/build-libcurl.html).
Außerdem mus snoch gegen ws2_32.lib und ich glaube noch was anderem gelinkt werden. Habe ich nicht im Kopf, sollte aber in irgendeiner Readme zu finden sein.