Qt mit Cygwin GCC compilen/nutzen



  • Heyho Community,

    ich bin momentan dabei (bzw. habe ich es vor) mich einwenig in Qt einzuarbeiten und damit herumzuspielen und würde es gerne auf Windows mit einem Cygwin Gcc verwenden. Allerdings bietet Trolltech nur fertige Pakete für VS oder MiniGW unter Windows.

    Also dachte ich: Sourcen ziehen (Qt 4.7) und selbst die Libs bauen. Weiter musste ich jetzt aber herausfinden, dass Cygwin offiziell gar nicht unterstüzt wird, und ein Selbstcompilen mit einem Cygwin GCC gar nicht so trivial ist...

    Kann mir irgendjemand sagen, ob es möglich ist das irgendwie hinzubekommen? Im Endeffekt habe ich am Ende (so der Wunsch) eben ein Eclipse mit Cygwin GCC zum Arbeiten mit Qt. Kann ich dafür einfach die fertigen Libraries aus dem Paket für den Visual Studio nehmen?

    Der Grund, warum ich nicht generell den Visual Studio nehme, den hätte ich nämlich auch da, ist der, dass dem cl Compiler einige C++0x Features fehlen die der GCC eben hat.

    Für Tips, Anmerkungen oder gar Lösungen für mein Problem bin ich natürlich dankbar! 🙂

    Gruß
    PuerNoctis



  • Also, ich habe gerade mal ein wenig herumexperimentiert, und es scheint an sich schon pur mit GCC zu funktionieren ein Qt-Programm (also ohne qmake) mit den im VS-Package gelieferten Libs zu compilen (um den MOC mach ich mir später sorgen, der wird später in den eigenen Buildprozess mit eingehängt).

    Allerdings habe ich keinen Plan welche Libraries ich dem Linker mitgeben muss - demnach erhalte ich beim Compile massig 'Unresolved Externals'. Ganz voran gleich die hier:

    undefined reference to `QApplication::QApplication(int&, char**, int)'
    

    Ich bin gerade mal durch alle in dem VS-Package entahltenen *.lib Files im <QtDir>/lib Verzeichnis durchgegangen und hab mir die Symbols angeguckt. Die 'qtgui4.lib' enthält Symbols für die Klasse (auch Ctor/Dtor wie es aussieht). Allerdings sind's wohl doch nicht die richtigen, denn der Linker meckert frivol weiter... 😞

    Beim rumgooglen kam heraus, dass viele in dem Fall meinen, es gäbe irgendwo eine 'qt.lib' (bzw. 'qt.so' auf Unix) die man einbinden muss. Allerdings finde ich das Teil nirgends.



  • Das kann nicht gehen, da die Libraries im VS-Download nur mit dem VS-Compiler funktionieren.

    Bei C++ kannst du libraries nur mit dem Compiler linken/benutzen, mit dem sie auch erstellt wurden. Es ist zum beispiel schon unwahrscheinlich, das mit gcc 4.2 kompilierte libraries sich mit gcc 4.4 linken lassen.

    Daher wird dir nix anderes übrig bleiben, als Qt mit deinem gcc komplett selbst zu übersetzen.

    Philipp



  • Bei C++ kannst du libraries nur mit dem Compiler linken/benutzen, mit dem sie auch erstellt wurden. Es ist zum beispiel schon unwahrscheinlich, das mit gcc 4.2 kompilierte libraries sich mit gcc 4.4 linken lassen.

    So definitiv kann man das aber auch nicht sagen. Beim compile-time-linking muss der Linker letztendlich (auf Windows COFF/PE) gegen einen vernünftigen Symbolname oder den entsprechenden Ordinal linken, dann ist der vollkommen zufrieden. Ob beim runtime-linking dann z.B. gewisse andere Runtime-Libraries (MSVCRT oder eben eine libstdc*) verfügbar sein müssen, ist wieder eine andere Geschichte. So war zumindest bisher mein Verständnis von der Sache. Bin aber weiss gott kein Profi auf dem Gebiet... Falls Du da was genauer zu sagen kannst widerleg mir das ruhig 🙂

    Aber zurück zur eigentlichen Sache: Beim Lesen eines Beitrags der Cygwin-Mailingliste ist mir ein Licht aufgegangen. Da hat einer mit Fortran (Cygwin) eine DLL gebaut und im VC dann verwendet. Was er nur machen musste, und das habe ich ganz vergessen und deckt sich teilweise auch mit dem was Philipp gesagt hat: Die Import-Lib IST Linkerspezifisch und musste vor dem Linken in das Format des Targetlinkers gerückt werden. Das sollte mit einigen Commands recht fix gehen - die DLLs können natürlich unberührt bleiben.

    Da ich gerade auf Arbeit bin muss ich das heute Nachmittag probieren.

    Gruß
    PuerNoctis

    P.S.: Und falls jemand zu der Linking-Geschichte was zu sagen hat, bitte schrein! Nicht das ich hier total den Schmuh erzähle

    EDIT: Und selbstverständlich wäre es sauberer Qt komplett selbst zu bauen. Würde ich auch gerne machen, aber wie gesagt, das scheint nicht so einfach zu sein wie man es gerne hätte... Wenn die weiteren "Experimente" von mir nicht ziehen, werde ich eben ein paralleles MinGW installieren und meinen GCC 4.6 dort neu bauen.



  • Erklär doch mal warum du überhaupt Qt in cygwin benutzen willst. Qt liefert doch mingw in der SDK mit, damit hast du unter Windows doch schon einen gcc Compiler.

    Und Biliotheken die mit mingw übersetzt werden funktionieren mit msvc nicht genauso wie umgekehrt.



  • Okay, ja, unanbhängig jetzt davon warum ich gerne Cygwin hätte und hie und da, ich werde jetzt den MinGW aus dem SDK nehmen, wie pospiech schon gesagt hat. Spart mir auch eine Menge Arbeit.

    Bei dem Thema "Lib compiled mit X kann nicht mit Y gelinked werden" bin ich jetzt auf dem Wissensstand, dass das Name Mangling der Symbols Linkerspezifisch ist. Microsoft "dekoriert" seine C++ Symbole anders wie der GCC (es gibt nur wenige Compiler, die das gleiche Schema verwenden), und damit ist die Sache natürlich eindeutig (http://en.wikipedia.org/wiki/Name_mangling#How_different_compilers_mangle_the_same_functions). Damit ist eben klar, dass es so, wie ich mir dachte, echt nicht gehen kann. Wieder um eine Erfahrung reicher!

    Schönen Abend noch!

    Gruß
    PuerNoctis


Anmelden zum Antworten