static linking fuer standalone exe funzt net



  • hallo,

    fuer die ausfuehrung einer standalone qt-exe auf einem anderen rechner habe ich QT nochmal (wie auf http://doc.trolltech.com/4.1/deployment-windows.html zu lesen) als static lib neu uebersetzt.
    lief alles einwandfrei.

    nun habe ich unter visual 2003 meine applikation nochmal neu uebersetzt und fuer die Projekteinstellungen (Release) bei den Laufzeitbibliotheks-angaben ein /MT (multi-threaded) zu stehen. Ferner sind bei mir bei den Einstellungen fuer den Linker als zusaetzliche Abhaengigkeiten qtmain.lib, QTGui4.lib und QTCore4.lib angegeben.

    Allerdings bekomme ich nun beim Linken am Ende folgende Fehlermeldung des Linkers, hoffe ihr koennt weiterhelfen.
    Intention ist es am Ende eine Standalone Exe zu haben die auf Rechnern ohne QT-Installation laufen kann:

    Fuer mich sieht das aus als ob da Debug und Release libs vermischt werden, habe aber keine Ahnung wie ich das beheben kann!?

    libcpmtd.lib(xdebug.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__malloc_dbg', verwiesen in Funktion '"void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z)'
    libcpmtd.lib(_tolower.obj) : error LNK2001: Nichtaufgelöstes externes Symbol __malloc_dbg
    libcpmtd.lib(xdebug.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__free_dbg', verwiesen in Funktion '"void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z)'

    Danke.



  • Du hast soweit recht, es vermischt sich Debug mit Release.
    Hast du evtl _DEBUG in den Präprozessoreinstellungen stehen? Wenn ja, schreib NDEBUG stattdessen oder andersrum.
    rya.



  • also es war in der tat fuer release noch bei den praeproz. einstellungen _DEBUG angegegeben. ich habe jetzt keine linker fehler mehr.

    allerdings laesst sich die exe auf einem anderen rechner nicht als standalone ausfuehren: es gibt meldungen beim start, dass eine dll (qtgui4.dll) benoetigt wird.

    ich habe qt statisch sowohl als release als auch debug gebaut (option -debug-and-release fuer configure tool).

    danach uebersetze ich mein eigenenes programm in der release einstellungen mit
    der Compiler-Option /MT fuer Multithreaded (Einstellungen fuer C++/Codererstellung)
    Unter den Angaben fuer den Linker/Eingabe sind qtmain.lib qtgui4.lib und qtcore4.lib angegeben).

    Obwohl sich die Anwendung einwandfrei uebersetzen laesst, wird beim start auf einem rechner wo es kein QT gibt trotzdem nach einer qtgui4.dll verlangt !?!?!?

    woran kann das liegen ?? vermutlich an irgendeiner zusaetzlichen fehlenden compiler/linker option, aber welche ?!?!?!

    waere sehr erfreut wenn jemand ne idee haette, wie ich das ganze als standalone exe bauen kann.

    QT-Version 4.4
    Visual 2003

    Vorgehen zum statischen bauen ist exakt so erfolgt wie auf der bereits geposteten Qt-Seite beschrieben, aber irgendwas scheint da noch zu fehlen.

    Vielen Dank.



  • Ich denke mal, die QT in der GPL-Edition linkt zur C-Runtime von M$ dynamisch, anders ist das nicht mit der GPL zu vereinbaren und sogar über diese dynamische Linkung streiten sich Lizenz-Experten seit Jahren, was die GPL angeht, da die msvcrtX0.dll nicht Teil des OS ist, von der msvcrt60.dll und msvcp60.dll abgesehen. Eigentlich dürfte man lt. FSF nur VC6 in Verbindung mit der GPL verwenden, eben weil diese Dateien bei XP dabei sind.
    Deswegen sind diese Dateien auch DLLs, da Sie das quasi sein müssen, wegen der Linkung wie oben beschrieben. Wenn QT in der GPL-Edition (die du hast?) statisch zur msvcXX.dll linkt, dann ist das ein Lizenzbruch der GPL und der Lizenz von M$.
    Nur so kann ichs mir gerade erklären.
    Aber warum muss das Ding unbedingt standalone sein? Hast du daran gedacht, dass du auf jedem PC trotzdem die mscrtXX.dll brauchst? Mehr Erklärung dazu.
    rya.

    ps.: Hier punktet wxWidgets. Hier ist eine komplette statische Linkung möglich.



  • also ich habe nirgendswo lesen koennen dass mit der GPL-Version von QT (uebrigens 4.4.0) ein statisches linken nicht moeglich sei. wenn es tatsaechlich so waere muesste es doch irgendwo als hinweis stehen?!

    grund warum ich eine standalone will ist schlicht und einfach der, dass ich keine zusaetzliched dll's mit vergeben will falls ich mal ne exe fuer jemand anderen erstelle sondern alles in einer einzigen exe haben moechte.

    Was mich noch interessieren wuerde ist:
    anscheinend habe ich die vorgehensweise zum statischen linken mit QT richtig wie auf trolltechs seite beschrieben (http://system-linux.net/doc/qt4/doc/html/deployment.html) durchgefuehrt: gabe keine compiler oder linker fehler mehr.
    die visual einstellungen sind denke ich auch korrekt. wie kommt es aber, wenn es wie gesagt wird

    Ich denke mal, die QT in der GPL-Edition linkt zur C-Runtime von M$ dynamisch, anders ist das nicht mit der GPL zu vereinbaren

    am ende keine compiler/linker meldungen kommen bei einem vorhaben, welches garnicht moeglich sein soll (am ende brauche ich trotzdem ne dll aber wieso ?!?!)

    Danke.



  • Ich habe gelesen, dass Qt nur mit der dynamischen C-Runtime-Bibliothek kompiliert wird und die statische Version nicht unterstützt wird. D.h. auch wenn du Qt statisch linkst, musst du die dynamische C-Runtime verwenden.

    http://lists.trolltech.com/qt4-preview-feedback/2004-12/msg00368.html


Log in to reply