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.
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
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
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" . -)
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 .
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
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:
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.
Wir können es uns nicht leisten, dass der Linker symbolische Links zu Bibliotheken verwendet, da dies das Bereitstellungspaket beschädigen würde.
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.
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.
in .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib
in .h/.cpp: #pragma comment(lib,"user32.lib")
#pragma comment(lib,"psapi.lib")