Linkprobleme mit MPIR



  • Builden und Linken von Fremdbibliotheken war nie meine Stärke und da offenbar der Chefentwickler vom GMP sich weigert, VS zu unterstützen (ich hab VS 2008, wenn das wichtig ist), hab ich MPIR als Wrapper probiert. Builden geht und folgendes Programm geht auch, wenn ich mpir.lib und mpirxx.lib dazu linke:

    #include <iostream>
    #include <mpirxx.h>
    
    int main()
    {
    	mpz_class a, b = 123;
    	a.set_str("123456789123456789123456789", 10);
    
    	std::cout << a + b << std::endl;
    }
    

    Zwar mit der Warnung

    LINK : warning LNK4098: Standardbibliothek "LIBCMT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
    

    aber egal.

    Sobald ich mich aber erdreiste, den String für a direkt im Konstruktor zu übergeben:

    mpz_class a("123456789123456789123456789");
    

    haut mir der Linker ein ganzes Päckchen Fehlermeldungen um die Ohren:

    msvcprt.lib(MSVCP90.dll) : error LNK2005: "protected: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Myptr(void)const " (?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IBEPBDXZ) ist bereits in mpirxx.lib(osdoprnti.obj) definiert.
    msvcprt.lib(MSVCP90.dll) : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) ist bereits in mpirxx.lib(osdoprnti.obj) definiert.
    msvcprt.lib(MSVCP90.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) ist bereits in mpirxx.lib(osdoprnti.obj) definiert.
    msvcprt.lib(MSVCP90.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) ist bereits in mpirxx.lib(osdoprnti.obj) definiert.
    msvcprt.lib(MSVCP90.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) ist bereits in mpirxx.lib(osdoprnti.obj) definiert.
    LINK : warning LNK4098: Standardbibliothek "LIBCMT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
    <privater Programmpfad> : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
    

    Da ich wie schon gesagt darin nicht besonders gut bin meine einfache Frage: wieso kommen die Fehler und wie behebe ich sie?



  • Die Bibliothek scheint mehrmals vorhanden zu sein.

    Du kannst die Warnung beachten und das genannte Flag setzen oder aber du versuchst es ohne die "neue" Lib und schaust mal, ob es funktioniert.

    Ich würde das Flag /NODEFAULTLIB benutzen, weil du da bessere Kontrolle hast was denn jetzt genau verwendet wird (auch die Version).



  • Ok vielen Dank für die Antwort, leider verstehen ich das nicht ganz.
    Die Bibliotheken mpirxx.lib und mpir.lib sind nur einmal vorhanden (zumindest in den Lib-Verzeichnisen des Compilers). Eine davon oder beide bei /NODEFAULTLIB einzutragen hat leider nicht funktioniert, genau so wenig wie das dortige Eintragen von msvcprt.lib oder LIBCMT, die ja im Konflikt stehen soll.

    Könntest du mir nochmal genauer erklären, woher diese Fehler überhaupt kommen, bzw. wie genau ich /NODEFAULTLIB verwenden muss, um sie zu beheben? Zur Zeit sehe ich da leider nicht wirklich durch, mir Librarys habe ich mich nie richtig befasst.


Anmelden zum Antworten