Hinzufügen einer externen Bibliothek zum Qt Creator-Projekt


112

Wie kann ich einem von Qt Creator RC1 (Version 0.9.2) erstellten Projekt eine externe Bibliothek hinzufügen? Zum Beispiel kann die win32 - Funktion EnumProcesses()erfordert Psapi.libin dem Projekt zu erstellen hinzugefügt werden.

Antworten:


216

Der richtige Weg, dies zu tun, ist wie folgt:

LIBS += -L/path/to -lpsapi

Auf diese Weise funktioniert es auf allen von Qt unterstützten Plattformen. Die Idee ist, dass Sie das Verzeichnis vom Bibliotheksnamen trennen müssen (ohne die Erweiterung und ohne das Präfix 'lib'). Wenn Sie eine Windows-spezifische Bibliothek einbinden, spielt dies natürlich keine Rolle.

Wenn Sie Ihre lib-Dateien im Projektverzeichnis speichern möchten, können Sie sie mit der $$_PRO_FILE_PWD_Variablen referenzieren , z.

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi

2
Ist es möglich, eine Umgebungsvariable als Bibliothekspfad anzugeben? Ich frage, weil das Schreiben von fest codierten Pfadnamen in die .pro-Datei Probleme verursachen würde, wenn ein Projekt von mehreren Personen entwickelt wird, bei denen möglicherweise nicht alle Bibliotheken an denselben Speicherorten installiert sind.
amtred

Das hat bei mir funktioniert, aber wenn ich ein vs-Projekt mit generiere qmake -tp vc, finde ich keine libs-Namen im Additional DependenciesProjekt, aber das vs-Projekt läuft gut. Bedeutet das, dass es einige andere Methoden gibt, um Additional Dependenciesvs hinzuzufügen ?
Sommersonne

1
Ich glaube nicht, dass Sie einen Pfad für eine integrierte Windows-Bibliothek angeben müssen. Unsere .pro-Dateien haben solche Zeilen im Abschnitt win32 : LIBS += -lGdi32.
Dan Korn

1
Wie @DanKorn feststellte, müssen (und sollten) Sie für integrierte Windows-Bibliotheken keinen Pfad angeben.
Bur

Warum können sie nicht einfach eine GUI erstellen, um eine Bibliothek smh hinzuzufügen?
GeneCode

24

Verwenden Sie qmakeProjekte? In diesem Fall können Sie mithilfe der LIBSVariablen eine externe Bibliothek hinzufügen . Z.B:

win32:LIBS += path/to/Psapi.lib

1
Entschuldigung für die lahme Frage, aber sollte die psapi-Bibliothek bereits vorgefertigt sein oder QtCreator sich um die Erstellung kümmern?
Dfr

11

LIBS + = C: \ Programme \ OpenCV \ lib

funktioniert nicht, weil Sie Leerzeichen in Programmdateien verwenden. In diesem Fall müssen Sie Anführungszeichen hinzufügen, damit das Ergebnis folgendermaßen aussieht: LIBS + = "C: \ Programme \ OpenCV \ lib" . Ich empfehle, Bibliotheken an Orten ohne Leerzeichen zu platzieren ;-)


Die neuesten Versionen von Qt (Creator) möchten immer (einzelne) Schrägstriche als Verzeichnistrennzeichen. Die einzige Ausnahme ist, wenn Sie den Befehl "system" unter Windows verwenden. Dann müssen Sie dem System einen entkommenen Schrägstrich zuführen, dh zwei Schrägstriche. Um alle Schrägstriche durch zwei Schrägstriche zu ersetzen, gehen Sie wie folgt vor : WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

Der Fehler, den Sie meinen, ist auf einen fehlenden zusätzlichen Include-Pfad zurückzuführen. Versuchen Sie es mit: INCLUDEPATH + = C: \ path \ to \ include \ files \ Hoffe, dass es funktioniert. Grüße.


4

Und um mehrere Bibliotheksdateien hinzuzufügen, können Sie wie folgt schreiben:

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / Filterung E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Grafik E: / DebugLibrary / VTK / GUISupport / Qt E: / DebugLibrary / VTK / Hybrid E: / DebugLibrary / VTK / Imaging E: / DebugLibrary / VTK / IO E: / DebugLibrary / VTK / Parallel E: / DebugLibrary / VTK / Rendering E: / DebugLibrary / VTK / Dienstprogramme E. : / DebugLibrary / VTK / VolumeRendering E: / DebugLibrary / VTK / Widgets E: / DebugLibrary / VTK / Wrapping

LIBS * = -LE: / DebugLibrary / VTKBin / bin / release -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


3

Wenn Sie Ihre Anwendung auf Kundencomputern bereitstellen möchten, anstatt Ihre Anwendung nur selbst zu verwenden, LIBS+= -Lxxx -lyyykann die Methode zu Verwirrung führen, wenn nicht sogar zu Problemen.

Wir entwickeln Anwendungen für Linux, Mac und Windows mit Qt. Wir versenden komplette, eigenständige Anwendungen. Daher sollten alle Nicht-Systembibliotheken im Bereitstellungspaket enthalten sein. Wir möchten, dass unsere Kunden die Anwendung für alle Betriebssysteme von demselben USB-Stick ausführen können. Aus Gründen der Plattformkompatibilität muss der USB-Stick dann als FAT32 formatiert werden, das keine (Linux-) Symlinks unterstützt.

Wir fanden die LIBS+= -Lxxx -lyyyRedewendung zu sehr wie eine Black Box:

  1. Wir wissen nicht genau, wie der Dateipfad der (statischen oder dynamischen) Bibliothek lautet, die vom Linker gefunden wurde. Dies ist unpraktisch. Unser Mac-Linker fand regelmäßig andere Bibliotheken als die, von denen wir dachten, dass sie verwendet werden sollten. Dies geschah mehrmals mit OpenSSL-Bibliotheken, in denen der Mac-Linker eine eigene - ältere, inkompatible - OpenSSL-Version anstelle unserer angeforderten Version fand und verwendete.

  2. Wir können es uns nicht leisten, dass der Linker Symlinks zu Bibliotheken verwendet, da dies das Bereitstellungspaket beschädigen würde.

  3. Wir möchten anhand des Namens der Bibliothek sehen, ob wir eine statische oder eine dynamische Bibliothek verknüpfen.

Für unseren speziellen Fall verwenden wir also nur absolute Dateipfade und prüfen, ob sie vorhanden sind. Wir entfernen alle Symlinks.

Zuerst finden wir heraus, welches Betriebssystem wir verwenden, und fügen dies in die Variable CONFIG ein. Und zum Beispiel für Linux 64bit:

linux64 {
    LIBSSL= $$OPENSSLPATH/linux64/lib/libssl.a
    !exists($$LIBSSL): error ("Not existing $$LIBSSL")
    LIBS+= $$LIBSSL
    LIBCRYPTO= $$OPENSSLPATH/linux64/lib/libcrypto.a
    !exists($$LIBCRYPTO): error ("Not existing $$LIBCRYPTO")
    LIBS+= $$LIBCRYPTO
}

Alle Abhängigkeiten können in das Bereitstellungspaket kopiert werden, da wir ihre Dateipfade kennen.


1

Der Vollständigkeit halber möchte ich hinzufügen, dass Sie auch nur den LIBRARY PATH hinzufügen können, in dem nach einer abhängigen Bibliothek gesucht wird (auf die in Ihrem Code möglicherweise nicht direkt verwiesen wird, die von Ihnen verwendete Bibliothek jedoch möglicherweise benötigt wird).

Zum Vergleich würde dies dem entsprechen, was die LIBPATH-Umgebung tut, aber es ist in Qt Creator dunkel und nicht gut dokumentiert.

Die Art und Weise, wie ich dazu kam, ist folgende:

LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"

Wenn Sie den tatsächlichen Bibliotheksnamen nicht angeben, wird im Wesentlichen der Pfad hinzugefügt, zu dem abhängige Bibliotheken durchsucht werden. Der Unterschied in der Syntax ist gering, aber dies ist sehr nützlich, um nur den Pfad anzugeben, in dem nach abhängigen Bibliotheken gesucht werden soll. Manchmal ist es nur mühsam, jedem Pfad eine einzelne Bibliothek zur Verfügung zu stellen, von der Sie wissen, dass sie sich alle in einem bestimmten Ordner befinden, und Qt Creator wird sie abholen.


0

in .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

in .h / .cpp: #pragma comment(lib,"user32.lib")

#pragma comment(lib,"psapi.lib")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.