Aggiunta di una libreria esterna al progetto Qt Creator


112

Come posso aggiungere una libreria esterna a un progetto creato da Qt Creator RC1 (versione 0.9.2)? Ad esempio, la funzione Win32 EnumProcesses()richiede Psapi.libda aggiungere al progetto di costruire.

Risposte:


216

Il modo corretto per farlo è così:

LIBS += -L/path/to -lpsapi

In questo modo funzionerà su tutte le piattaforme supportate da Qt. L'idea è che devi separare la directory dal nome della libreria (senza l'estensione e senza alcun prefisso "lib"). Ovviamente, se includi una libreria specifica per Windows, questo non ha importanza.

Nel caso in cui desideri memorizzare i tuoi file lib nella directory del progetto, puoi fare riferimento ad essi con la $$_PRO_FILE_PWD_variabile, ad esempio:

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

2
È possibile specificare una variabile d'ambiente come percorso di libreria? Sto chiedendo perché scrivere nomi di percorso hardcoded nel file .pro interromperebbe le cose se un progetto viene sviluppato da più persone che potrebbero non avere tutte le librerie installate nelle stesse posizioni.
antred

Questo ha funzionato per me, ma quando genero un progetto vs con qmake -tp vc, non trovo nomi di librerie nel Additional Dependenciesprogetto, ma il progetto vs funziona bene. Significa che ci sono altri metodi per aggiungere Additional Dependenciesvs?
Summer Sun

1
Non penso che sia necessario specificare un percorso per una libreria Windows incorporata. I nostri file .pro hanno linee di questo tipo nella sezione win32: LIBS += -lGdi32.
Dan Korn

1
Come ha notato @DanKorn, per le librerie Windows integrate non è necessario (e non si dovrebbe) specificare un percorso.
fresa

Perché non possono semplicemente creare una GUI per aggiungere una libreria smh.
GeneCode

24

Stai usando qmakeprogetti? In tal caso, puoi aggiungere una libreria esterna utilizzando la LIBSvariabile. Per esempio:

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

1
Ci scusiamo per la domanda debole, ma la libreria psapi dovrebbe essere già precostruita o QtCreator si prenderà cura di costruirla?
Dfr

11

LIBS + = C: \ Programmi \ OpenCV \ lib

non funzionerà perché stai utilizzando spazi vuoti in Programmi. In questo caso devi aggiungere virgolette, quindi il risultato sarà questo: LIBS + = "C: \ Program Files \ OpenCV \ lib" . Consiglio di posizionare le librerie in posizioni non in spazi vuoti ;-)


Le versioni più recenti di Qt (Creator) vogliono sempre barre (singole) come separatori di directory. L'unica eccezione è quando si utilizza il comando "system" in Windows. Quindi è necessario fornire al sistema una barra all'indietro con escape, vale a dire due barre all'indietro. Per sostituire tutte le barre in avanti con due barre rovesciate può essere fatto come segue: WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

L'errore che intendi è dovuto alla mancanza del percorso di inclusione aggiuntivo. Prova ad aggiungerlo con: INCLUDEPATH + = C: \ path \ to \ include \ files \ Spero che funzioni. Saluti.


4

E per aggiungere più file di libreria puoi scrivere come di seguito:

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / Filtering E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Graphics 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 / Utilities E : / DebugLibrary / VTK / VolumeRendering E: / DebugLibrary / VTK / Widgets E: / DebugLibrary / VTK / Wrapping

LIBS * = -LE: / DebugLibrary / VTKBin / bin / rilasciare -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


3

Se desideri distribuire la tua applicazione sulle macchine dei clienti, piuttosto che utilizzare la tua applicazione solo tu stesso, scopriamo che il LIBS+= -Lxxx -lyyymetodo può creare confusione se non problemi.

Sviluppiamo applicazioni per Linux, Mac e Windows utilizzando Qt. Spediamo applicazioni complete e autonome. Quindi tutte le librerie non di sistema dovrebbero essere incluse nel pacchetto di distribuzione. Vogliamo che i nostri clienti siano in grado di eseguire l'applicazione dalla stessa chiavetta USB per tutti i sistemi operativi. Per motivi di compatibilità della piattaforma, la chiavetta USB deve essere formattata come FAT32, che non supporta i collegamenti simbolici (Linux).

Abbiamo trovato l' LIBS+= -Lxxx -lyyyidioma troppo di una scatola nera:

  1. Non sappiamo esattamente quale sia il percorso file della libreria (statica o dinamica) che è stata trovata dal linker. Questo è scomodo. Il nostro linker per Mac trovava regolarmente librerie diverse da quelle che pensavamo dovessero essere utilizzate. Ciò è accaduto più volte con le librerie OpenSSL in cui il linker per Mac ha trovato e utilizzato la propria versione OpenSSL, più vecchia e incompatibile, anziché la versione richiesta.

  2. Non possiamo permetterci che il linker utilizzi collegamenti simbolici alle librerie poiché ciò interromperebbe il pacchetto di distribuzione.

  3. Vogliamo vedere dal nome della libreria se colleghiamo una libreria statica o dinamica.

Quindi per il nostro caso particolare usiamo solo percorsi di file assoluti e controlliamo se esistono. Rimuoviamo tutti i collegamenti simbolici.

Per prima cosa scopriamo quale sistema operativo stiamo utilizzando e lo inseriamo nella variabile CONFIG. E, ad esempio per Linux a 64 bit, quindi:

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
}

Tutte le dipendenze possono essere copiate nel pacchetto di distribuzione poiché conosciamo i loro percorsi di file.


1

Vorrei aggiungere per completezza che puoi anche aggiungere solo il PERCORSO DELLA LIBRERIA dove cercherà una libreria dipendente (che potrebbe non essere direttamente referenziata nel tuo codice ma una libreria che usi potrebbe averne bisogno).

Per confronto, ciò corrisponderebbe a ciò che fa l'ambiente LIBPATH ma è un po 'oscuro in Qt Creator e non ben documentato.

Il modo in cui sono arrivato a questo è il seguente:

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

Essenzialmente se non si fornisce il nome effettivo della libreria, aggiunge il percorso in cui cercherà le librerie dipendenti. La differenza di sintassi è piccola ma è molto utile per fornire solo il PERCORSO dove cercare le librerie dipendenti. A volte è solo una seccatura fornire ogni singola libreria di percorso in cui sai che sono tutte in una determinata cartella e Qt Creator le raccoglierà.


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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.