VS2010 libcmt.lib



  • Hallo,
    ich versuche, ein Projekt statisch zu linken, also mit /MT-Option.
    Dafür nötig ist laut MSDN die libcmt.lib. Das Problem ist, dass diese sich nicht gut mit MSVCRT.lib versteht und diverse Linker-Fehler hervorruft.
    Nutze ich, wie vorgeschlagen, /NODEFAULTLIB, gibt es widerrum viele Linkerfehler von Qt.
    Was kann ich tun?



  • Du musst einfach nur *alles* statisch linken. Also auch alle LIBs die Du einbinden willst...



  • Und wie tue ich das?
    Ich habe Qt statisch kompiliert. Ich habe nicht gelesen, dass ich noch mehr machen müsse, damit es sich auch fehlerfrei in ein Programm einbinden lässt.



  • Ich ignoriere die Warnung meist.



  • Und sonst verwendest Du keine weiteren LIBs? Und Dein Hauptprogramm linkt auch statisch? Dann wäre das seltsam. Du kannst in den Linker-Einstellungen die Ausgabe auf "/VERBOSE" stellen, dann siehst Du wer "schuld" an der falschen Referenz ist...



  • @ knivil: Es ist keine Warnung, sondern ein Fehler, der dafür sorgt, dass keine Executable erstellt wird.

    @ Jochen Kalmbach:
    Nein, keine weiteren LIBs.
    Wie gesagt, ich habe /MT angegeben, was, laut Google, alles nötige ist um statisch zu linken.

    Welche Information von /VERBOSE genau ist wichtig? Fehlermeldungen (habe diese mal unten gepostet) werden ja auch ohne diese Option ausgegeben.

    ohne /NODEFAULTLIB

    1>          "msvcrt.lib(ti_inst.obj)" geladen
    1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
    1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
    1>  Durchsuchen der Bibliotheken abgeschlossen.
    1>LIBCMT.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
    

    mit /NODEFAULTLIB

    1>  Durchsuchen der Bibliotheken abgeschlossen.
    1>  
    1>  Durchlauf 1 abgeschlossen
    1>  
    1>tab3widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___security_cookie".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___security_cookie".
    1>tabdata.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___security_cookie".
    1>fgwindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___security_cookie".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___security_cookie".
    1>tab1widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___security_cookie".
    1>tab2widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___security_cookie".
    1>tab3widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___CxxFrameHandler3".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___CxxFrameHandler3".
    1>tabdata.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___CxxFrameHandler3".
    1>fgwindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___CxxFrameHandler3".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___CxxFrameHandler3".
    1>tab1widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___CxxFrameHandler3".
    1>tab2widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "___CxxFrameHandler3".
    1>tab3widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    1>tabdata.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    1>fgwindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    1>tab1widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    1>tab2widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)".
    1>tabdata.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)".
    1>fgwindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)".
    1>tab1widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)".
    1>tab2widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)".
    1>tab3widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)".
    1>tabdata.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)".
    1>fgwindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)".
    1>tab1widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)".
    1>tab2widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)".
    1>tab3widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""const type_info::`vftable'" (??_7type_info@@6B@)".
    1>fgwindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""const type_info::`vftable'" (??_7type_info@@6B@)".
    1>tab1widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""const type_info::`vftable'" (??_7type_info@@6B@)".
    1>tab2widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""const type_info::`vftable'" (??_7type_info@@6B@)".
    1>tab3widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""const type_info::`vftable'" (??_7type_info@@6B@)".
    1>qrc_fgwindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_atexit".
    1>tab1widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_memcpy".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_memcpy".
    1>tabdata.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__CxxThrowException@8".
    1>tab1widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__CxxThrowException@8".
    1>tab2widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__CxxThrowException@8".
    1>tab3widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__CxxThrowException@8".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__CxxThrowException@8".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__fltused".
    1>tab4widget.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__ftol2_sse".
    1>LINK : error LNK2001: Nicht aufgelöstes externes Symbol "_WinMainCRTStartup".
    1>C:\Users\Wurst\Documents\Visual Studio 2010\Projects\food gen\Win32\Release Static Linking\\food gen.exe : fatal error LNK1120: 12 nicht aufgelöste externe Verweise.
    


  • 1.) Hast du das Service Pack fuer VS 2010 installiert?
    2.) Hast du vielleicht RTTI und Exceptions ausgeschaltet?
    3.) Ist deine Qt-Lib auch fuer das gleiche Visual Studio ausgelegt?

    Das Problem hatte ich auch mal, keine Ahnung bei welcher Version, aber nach einem Update blieb vom Fehler nur noch die Warnung uebrig:

    LIBCMT.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
    

    Die genaueren Umstaende sind mir aber entfallen.



  • Den Fehler habe ich gefunden.
    Qt reicht es offensichtlich nicht, wenn man ihm per Kommandozeile sagt, dass man eine statische Library haben will. Man muss es auch noch in zwei verschiedenen Dateien angeben, ansonsten erhält man statische lib-Dateien, die aber auf DLL-Dateien angewiesen sind.
    Diese Information wird auch in fast allen Tutorials, die ich zu diesem Thema gelesen habe, verschwiegen...

    Danke aber, für die Hilfeversuche.



  • Zwischenfrage: Wie gross ist Qt als statische Bibliothek? Und wie gross sind einfache Programme nach dem Linken?



  • QtCore.lib 25 MB
    QtGui.lib 40 MB

    Die meisten anderen Libs sind um 1 MB groß.

    Mein Programm hat 7 MB.



  • Nur zum Vergleich, ich habe fltk jetzt fuer mich entdeckt. Statische kompilierung, vorgefertigte Projekte fuer VS 2010, 2008, VC6. Nur Windowtoolkit: keine Threads, Strings oder Netzwerkunterstuertzung ... etc. Sehr einfach zu benutzten. Mittelkomplexe Programme so um die 250 KByte statisch gelinkt. Die statische Bibliothek ist weniger als 5 MByte gross + kleinere Support libs fuer zLib, png oder jpeg.


Anmelden zum Antworten