tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
778
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    badday badday ist offline Mitglied Brokat
    Registriert seit
    Dec 2009
    Beiträge
    321
    Blog-Einträge
    1
    Moin zusammen,

    ich versuche seit gestern, mein Projekt auf Windows zu portieren, scheitere aber nach wie vor am linken einiger Bibliotheken. Konkret brauche ich folgende libs: boost_system, boost_filesystem, curllib und crypto++.
    Daher habe ich in einem Unterordner meines Projekt folgende Dateien:
    boost_filesystem-vc90-mt-1_42.dll
    boost_filesystem-vc90-mt-1_42.lib
    boost_filesystem-vc90-mt-gd-1_42.dll
    boost_filesystem-vc90-mt-gd-1_42.lib
    boost_system-vc90-mt-1_42.dll
    boost_system-vc90-mt-1_42.lib
    boost_system-vc90-mt-gd-1_42.dll
    boost_system-vc90-mt-gd-1_42.lib
    cryptlib.lib
    curllib.lib
    libboost_filesystem-vc90-mt-1_42.lib
    libboost_filesystem-vc90-mt-gd-1_42.lib
    libboost_filesystem-vc90-mt-s-1_42.lib
    libboost_filesystem-vc90-mt-sgd-1_42.lib
    libboost_filesystem-vc90-s-1_42.lib
    libboost_filesystem-vc90-sgd-1_42.lib
    libboost_system-vc90-mt-1_42.lib
    libboost_system-vc90-mt-gd-1_42.lib
    libboost_system-vc90-mt-s-1_42.lib
    libboost_system-vc90-mt-sgd-1_42.lib
    libboost_system-vc90-s-1_42.lib
    libboost_system-vc90-sgd-1_42.lib
    Die Boost-Dateien habe ich mithilfe von http://www.boostpro.com/ dorthin gepackt.

    Ich verwende das VS 2008 Professional. Darin habe ich unter Project/Configuration Properites/Linker/General bei Additional Library Directories das Verzeichnis angegeben, das die oben genannten Dateien enthält.
    Dann treten einige Probleme auf:

    Code :
    1
    2
    
    main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall CryptoPP::Filter::Initialize(class CryptoPP::NameValuePairs const &,int)" (?Initialize@Filter@CryptoPP@@UAEXABVNameValuePairs@2@H@Z)
    main.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall CryptoPP::Filter::Flush(bool,int,bool)" (?Flush@Filter@CryptoPP@@UAE_N_NH0@Z)
    Dies ist nur ein kleiner Ausschnitt. Wenn ich nun die lib cryptlib.lib explizit unter Project/Configuration Properites/Linker/Input bei Additional Dependencies angebe, so scheint die lib soweit in Ordnung. Nun habe ich z. B. folgende Meldung:
    Code :
    1
    2
    
    error LNK2019: unresolved external symbol __imp__curl_easy_cleanup referenced in function "bool __cdecl updateFile(class std::basic_string,class std::allocator
    Daher das selbe Spiel mit[B] libcurl.lib[/B] wie zuvor mit cryptlib.lib.
    Nun tritt z. B. folgendes auf:

    LIBCMTD.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in MSVCRTD.lib(MSVCR90D.dll)
    Daher trage ich unter Project/Configuration Properites/Linker/Input bei Ignore Specific Library libcmtd.lib ein, wie bei http://support.microsoft.com/kb/148652 beschrieben. Danach tritt beispielhaft
    Code :
    1
    2
    3
    4
    5
    
    msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_string,class std::allocator > & __thiscall std::basic_string,class std::allocator >::operator+=(char const *)" (Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) already defined in cryptlib.lib(filters.obj)
     
    ...
     
    libcpmtd.lib(locale0.obj) : error LNK2005: "public: class std::basic_string,class std::allocator > & __thiscall std::basic_string,class std::allocator >::operator=(char const *)" (4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    auf. Daher füge ich diese zu den ignorierten libs hinzu. Das resultiert z. B. in
    Code :
    1
    2
    
    main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class std::basic_string,class std::allocator > & __thiscall std::basic_string,class std::allocator >::operator+=(char)" (__imp_Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@D@Z) referenced in function "public: class std::basic_string,class std::allocator > const __thiscall boost::filesystem::basic_path,class std::allocator >,struct boost::filesystem::path_traits>::file_string(void)const " (?file_string@?$basic_path@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@Upath_traits@filesystem@boost@@@filesystem@boost@@QBE?BV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
    libboost_filesystem-vc90-mt-gd-1_42.lib(operations.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class std::basic_string,class std::allocator > & __thiscall std::basic_string,class std::allocator >::operator+=(char)" (__imp_Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@D@Z)
    Soweit bin ich nun und eine Lösung scheint nicht in Sicht (obgleich ich zugeben muss, von Linken nicht viel Ahnung zu haben). Wenn mir irgendjemand weiterhelfen kann, oder auch nur meint, es zu können, ich bin für jeden Tipp dankbar.

    Soweit mein bisher wohl längster Threaed

    Vielen Dank.


    Gruß,

    badday
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Du verwendest gleichzeitig die statische und dynamische Microsoft Runtime Bibliothek.

    Das ist nicht möglich.

    Du mußt dein Projekt auf die MSVC Runtime stellen, die von allen Bibliotheken unterstützt wird.

    Die Boost Bibliotheken sind dabei kein Problem, denn von diesen gibt es die Bibliotheken in jeglicher Ausprägung und schließlich werden diese auch automatisch gelinkt.

    Wo hast du die libcurl bzw. crypto++ Bibliotheken her? Hast du die selbst erstellt?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    badday badday ist offline Mitglied Brokat
    Registriert seit
    Dec 2009
    Beiträge
    321
    Blog-Einträge
    1
    OK, also crypto++ habe ich selbst erstellt, mit /MTd. Libcurl habe ich nicht selbst erstellt. Kompiliere ich nun das Projekt mit /MTd, so funktioniert das zunächst (er kompiliert es, beschwert sich allerdings danach, dass die curllib.dll fehle. Wo genau muss ich die hinpacken?
    Oder kann ich den Pfad irgendwo angeben? Bzw. kann ich vermeiden, dass er auf die dll zurückgreift, indem ich statisch linke?

    Gruß,

    badday
    Geändert von badday (17.05.10 um 20:00 Uhr)
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von badday Beitrag anzeigen
    OK, also crypto++ habe ich selbst erstellt, mit /MTd. Libcurl habe ich nicht selbst erstellt. Kompiliere ich nun das Projekt mit /MTd, so funktioniert das zunächst (er kompiliert es, beschwert sich allerdings danach, dass die curllib.dll fehle. Wo genau muss ich die hinpacken?
    Siehe http://msdn.microsoft.com/en-us/libr...86(VS.85).aspx

    Zitat Zitat von badday Beitrag anzeigen
    Oder kann ich den Pfad irgendwo angeben? Bzw. kann ich vermeiden, dass er auf die dll zurückgreift, indem ich statisch linke?
    Ja, natürlich. Du mußt nur eine statische Version der Bibliothek erstellen. (vorausgesetzt das ist von der Bibliothek auch so vorgesehen, manche Bibliotheken haben besonderen Initialisierungscode der in der DllMain ausgeführt werden muss...)

    Gruß
    Geändert von deepthroat (17.05.10 um 20:43 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    badday badday ist offline Mitglied Brokat
    Registriert seit
    Dec 2009
    Beiträge
    321
    Blog-Einträge
    1
    Ich habe leider immer noch ein Problem mit libcurl. Ich habe hier noch einmal geschaut: http://curl.haxx.se/docs/faq.html#Li...uilding_libcur und die lib selber gebaut - erfolgreich. Nun ist aber immer noch das Problem, dass, wenn ich das ganze kompiliere, es nach wie vor "unresolved external symbols" gibt, wie z. B. _imp_curl_easy_cleanup.
    Ich habe libcurld.lib vorliegen und linke sie auch, aber offenbar sind diese Symbole dort nun enthalten.

    Weiß jemand weiter?

    Danke.

    Gruß,

    badday
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von badday Beitrag anzeigen
    Ich habe leider immer noch ein Problem mit libcurl. Ich habe hier noch einmal geschaut: http://curl.haxx.se/docs/faq.html#Li...uilding_libcur und die lib selber gebaut - erfolgreich. Nun ist aber immer noch das Problem, dass, wenn ich das ganze kompiliere, es nach wie vor "unresolved external symbols" gibt, wie z. B. _imp_curl_easy_cleanup.
    Ich habe libcurld.lib vorliegen und linke sie auch, aber offenbar sind diese Symbole dort nun enthalten.

    Weiß jemand weiter?
    Hast du denn auch das CURL_STATICLIB Makro in deinem Projekt in dem du libcurl verwendest definiert?

    Gruß
    badday bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    badday badday ist offline Mitglied Brokat
    Registriert seit
    Dec 2009
    Beiträge
    321
    Blog-Einträge
    1
    Ja, ich hatte das DCURL_STATICLIB Makro in beiden definiert.
    OK, nun scheint es zu funktionieren. Nach diesem Tipp: http://social.msdn.microsoft.com/For...a-cb042a4de83c.
    Danke auch an deepthroat, für seine Geduld und seine guten Tipps.

    Gruß,

    badday
    Geändert von badday (18.05.10 um 16:13 Uhr)
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von badday Beitrag anzeigen
    Ja, ich hatte das DCURL_STATICLIB Makro in beiden definiert.
    Das Makro muss aber CURL_STATICLIB heißen, das -D ist nur ein Compiler-Switch.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    badday badday ist offline Mitglied Brokat
    Registriert seit
    Dec 2009
    Beiträge
    321
    Blog-Einträge
    1
    Funktioniert aber mit DCURL_STATICLIB, aber mag sein, dass du recht hast.

    Gruß,

    badday
     

Ähnliche Themen

  1. libnoise + noiseutils -> Linkerprobleme
    Von badday im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 29.08.10, 13:49