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.lib

    In 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 😞


  • Administrator

    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.


  • Administrator

    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-Library

    Da 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


  • Administrator

    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 😕


  • Administrator

    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 Definitions

    Dort 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 libs

    Beides 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.


Anmelden zum Antworten