QT Newbie - dynamisch linken



  • Hi, in unserer Firma wollen wir nun die GUI auf Qt umstellen. Die DLLs sollen dynamisch gelinkt werden, um die kostenlose Version verwenden zu können. Unseren Source Code wollen wir auch nicht veröffentlichen müssen. Kann mir jemand ein "Hello World" Beispiel geben um QT dynamisch zu linken? Ich habe DLLs bislang immer statisch gelinkt. Und welche der angebotenen Versionen (Enterprise, Professional, Community) ist denn die richtig für mich? Und benötige ich diesen QT Creator unbedingt? Ich möchte lieber mit Visual Studio entwickeln.

    Gruß BirdyBird



  • Oh Mann, das findest du alles in ein paar Minuten googoln 🙄



  • Habe ich zumindest nicht. Die Beispiele beziehen sich immer auf statisches linken. Wie wäre es dann mal ein solches Beispiel zu geben, anstatt anonym einen völlig inhaltslosen Kommentar abzulassen.



  • Inhaltslos ist etwas anderes.

    Codetechnisch ist mit DLL nix anders, weiß nicht was du willst. Baue einfach ohne -static.

    Hier http://www.qt.io/download/ siehst du doch, dass nur "Community" kostenlos ist.

    Und es gibt ein Visual Studio addin. Warum nicht nach "Qt Visual Studio" suchen?

    Weiterhin: 🙄

    :p



  • Ahh, ich habe da was verwechselt. Ich dachte ich hätte meine DLLs bislang statisch gelinkt. Hatte die Projekte an der Arbeit leider nicht zur Hand. Tatsächlich habe ich diese aber dynamisch gelinkt. War also schon richtig. Ich habe mich durch diesen Artikel in die Irre führen lassen:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms686944%28v=vs.85%29.aspx

    Ich dachte um eine DLL dynamisch zu linken müsste ich sie zur Laufzeit über die Funktion "LoadLibrary" einbinden. Aber das ist wohl wieder ein anderes Thema. Also danke für den Schupser in die richtige Richtung. Allerdings muss ich wenn ich die dynamisch kompilierte DLL einbinde immer die lib Datei mit einbinden "#pragma comment(lib, "Company.lib")". Ist das richtig so? Will halt sicher sein, dass ich die DLL wirklich dynamisch gelinkt habe.



  • Die statisch *.libs in Qt enthalten nur die Information über Funktionen Namen wenn Qt ist dynamish kompiliert. Es ist richtig #pragma comment zu benutzen für dynamisch Qt. Sie können nich DLLs statisch linken.



  • Allles klar, danke für die Info.
    Noch eine andere Frage. In meinem Projekten habe ich folgendes stehen:

    #ifdef MY_EXPORTS
      #define MY_API __declspec(dllexport)
    #else
      #define MY_API __declspec(dllimport)
    #endif
    
    //#define MY_API
    

    Ich habe zwei TestApplicationen. Die eine die die DLL dynamisch linkt und eine die die Sourcen direkt implementiert (aus Debugging-Gründen). Dazu muss ich aber immer entweder den oberen #ifdef ... #endif Block oder die untere #define Zeile (aus-)kommentieren, je nach dem welches der beiden Projekte ich kompilieren möchte. Kann man das auch so lösen dass ich mir das auskommentieren sparen kann?



  • Der Sinn der Makros ist ja gerade, daß man nichts auskommentieren muß.
    Definiere einfach - für das Projekt, welches die Lib erzeugt(!) - (vor dem Einbinden) das Makro:

    #define MY_EXPORTS
    
    #include "..."
    

    (alternativ über die Projekteinstellungen festlegen)

    Für deinen Anwendungsfall (zwei Testapplikationen) sollte jedoch 'dllimport' jeweils verwendet werden können.
    Oder auch dafür ein Makro definieren:

    #ifdef MY_EXPORTS_DEBUG
     #define MY_API
    #elif MY_EXPORTS
     // ...
    #endif
    


  • Genau, ich habe das MY_EXPORTS unter den Präprozessordefinitionen für das DLL-Projekt eingetragen. Ich fände es halt schöner, wenn Anwender der DLL bzw. der Codes keine Defines machen müssten. Ich habe jetzt mal folgendes geschrieben:

    #ifndef _USRDLL
      #define MY_API
    #else
      #ifdef MY_EXPORTS
        #define MY_API __declspec(dllexport)
      #else
        #define MY_API __declspec(dllimport)
      #endif
    #endif
    

    Denn die Verwendung der Sourcen mit dllimport funktioniert nicht.
    Wie "portabel" das allerdings ist weiß ich nicht.



  • BirdyBird schrieb:

    Ich fände es halt schöner, wenn Anwender der DLL bzw. der Codes keine Defines machen müssten.

    Muss er auch nicht. Nur du selber in deiner DLL musst es definieren.



  • Du könntest MY_EXPORTS als die command line Kompilator Optionen passen für deine DLL. Es is besser als #define in C++. Wenn du Visual Studio oder QtCreator als IDE verwendest, du kannst es in die Projekt Optionen tun.


Anmelden zum Antworten