wake-up-neo.com

Hinzufügen einer externen Bibliothek zum Qt Creator-Projekt

Wie kann ich einem von Qt Creator RC1 (Version 0.9.2) erstellten Projekt eine externe Bibliothek hinzufügen? Beispielsweise erfordert die win32-Funktion EnumProcesses(), dass Psapi.lib dem zu erstellenden Projekt hinzugefügt wird.

102
Donotalo

Der richtige Weg, dies zu tun, ist folgendermaßen:

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 Erweiterung und ohne Präfix 'lib'). Wenn Sie eine Windows-spezifische Bibliothek hinzufügen, spielt dies natürlich keine Rolle.

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

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

Verwenden Sie qmake-Projekte? In diesem Fall können Sie eine externe Bibliothek mit der Variablen LIBS hinzufügen. Z.B:

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

LIBS + = C:\Programme\OpenCV\lib

funktioniert nicht, weil Sie Leerzeichen in Programmdateien verwenden. In diesem Fall müssen Sie Anführungszeichen hinzufügen. Das Ergebnis sieht dann so aus: LIBS + = "C:\Programme\OpenCV\lib" . -)

11
martin

Der Fehler, den Sie meinen, liegt daran, dass der zusätzliche Include-Pfad fehlt. __ Versuchen Sie es mit folgendem Code hinzuzufügen: INCLUDEPATH + = C:\Pfad\zu\include\files\ Hoffe, es funktioniert .

6
fernando

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

INCLUDEPATH * = E:/DebugLibrary/VTK E:/DebugLibrary/VTK/Common E:/DebugLibrary/VTK/Filtern 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/Rendern 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 -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering

4
QT-ITK-VTK-Help

Wenn Sie Ihre Anwendung auf Maschinen von Kunden bereitstellen möchten, anstatt Ihre Anwendung nur selbst zu verwenden, stellen wir fest, dass die LIBS+= -Lxxx -lyyy-Methode zu Verwirrung führen kann, wenn nicht Probleme.

Wir entwickeln Anwendungen für Linux, Mac und Windows mit Qt. Wir liefern 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 vom selben USB-Stick ausführen können. Aus Gründen der Plattformkompatibilität muss der USB-Stick dann als FAT32 formatiert werden, was (Linux) Symlinks nicht unterstützt.

Wir fanden das LIBS+= -Lxxx -lyyy-Idiom zu viel von einer Blackbox:

  1. Wir wissen nicht genau, was der Dateipfad der (statischen oder dynamischen) Bibliothek ist, die vom Linker gefunden wurde. Das ist unbequem. Unser Mac-Linker fand regelmäßig andere Bibliotheken als die, von denen wir dachten, dass sie verwendet werden sollten. Dies geschah mehrmals bei OpenSSL-Bibliotheken, in denen der Mac-Linker seine eigene, ältere, inkompatible OpenSSL-Version fand und verwendete, anstatt die von uns angeforderte Version.

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

  3. Wir wollen aus dem name 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 existieren. Wir entfernen alle Symlinks.

Zuerst erfahren wir, 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, sobald wir ihre Dateipfade kennen.

3
adlag

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, aber eine von Ihnen verwendete Bibliothek möglicherweise benötigt wird).

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

Die Art, wie ich hier herum gekommen bin, ist folgende:

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

Wenn Sie nicht den tatsächlichen Bibliotheksnamen angeben, wird der Pfad dort eingefügt, wo abhängige Bibliotheken durchsucht werden. Der Unterschied in der Syntax ist gering, aber dies ist sehr nützlich, wenn Sie nur den Pfad angeben, in dem nach abhängigen Bibliotheken gesucht werden soll. Es ist manchmal einfach ein Schmerz, jeden Pfad einzeln anzugeben, von dem Sie wissen, dass er alle in einem bestimmten Ordner liegt und Qt Creator sie abholt.

1
zar

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

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

#pragma comment(lib,"psapi.lib")
0
Dnyaneshwar