Aggiunta di una libreria esterna nel progetto Qt Creator

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 che Psapi.lib sia aggiunto nel progetto da Psapi.lib .

Il modo corretto per farlo è come questo:

 LIBS += -L/path/to -lpsapi 

In questo modo funzionerà su tutte le piattaforms supportate da Qt. L’idea è che devi separare la directory dal nome della libreria (senza l’estensione e senza alcun prefisso ‘lib’). Naturalmente, se si include una lib specifica per Windows, questo non importa.

Nel caso in cui desideri archiviare i tuoi file lib nella directory del progetto, puoi farli riferimento con la variabile $$_PRO_FILE_PWD_ , ad esempio:

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

Stai usando i progetti qmake ? In tal caso, è ansible aggiungere una libreria esterna utilizzando la variabile LIBS . Per esempio:

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

LIBS + = C: \ Programmi \ OpenCV \ lib

non funzionerà perché stai usando spazi bianchi in Programmi. In questo caso devi aggiungere virgolette, quindi il risultato sarà simile a questo: LIBS + = “C: \ Programmi \ OpenCV \ lib” . Consiglio di posizionare le librerie in posizioni non spaziali 😉

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

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

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 / Ibrido 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 / Widget 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

Se si desidera distribuire l’applicazione su macchine di clienti, invece di utilizzare solo l’applicazione, si scopre che il metodo LIBS+= -Lxxx -lyyy può portare a confusione se non a problemi.

Sviluppiamo applicazioni per Linux, Mac e Windows usando Qt. Spediamo applicazioni complete e stand-alone. 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 quindi essere formattata come FAT32, che non supporta i collegamenti simbolici (Linux).

Abbiamo trovato l’idioma LIBS+= -Lxxx -lyyy troppo di una scatola nera:

  1. Non sappiamo esattamente quale sia il percorso file della libreria (statica o dynamic) che è stata trovata dal linker. Questo è scomodo. Il nostro linker per Mac ha trovato regolarmente librerie diverse da quelle che pensavamo dovessero essere utilizzate. Ciò è accaduto diverse volte con le librerie OpenSSL in cui il linker Mac ha trovato e usato la sua versione precedente, incompatibile, OpenSSL piuttosto che la nostra versione richiesta.

  2. Non possiamo permetterci che il linker utilizzi i collegamenti simbolici alle librerie in quanto ciò interromperà il pacchetto di distribuzione.

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

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

Prima scopriamo quale sistema operativo stiamo usando e lo inseriamo nella variabile CONFIG. E, ad esempio per Linux 64bit, allora:

 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 come sappiamo i loro percorsi di file.

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

Per confronto, questo corrisponderebbe a ciò che l’ambiente LIBPATH fa ma il suo tipo di oscuro in Qt Creator e non ben documentato.

Il modo in cui mi sono imbattuto in questo sta seguendo:

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

In sostanza, se non si fornisce il nome effettivo della libreria, viene aggiunto il percorso in cui cercherà le librerie dipendenti. La differenza nella syntax è piccola, ma è molto utile fornire solo il PATH in cui cercare le librerie dipendenti. A volte è solo un problema fornire a ciascun percorso una singola libreria dove sai che sono tutti in una determinata cartella e Qt Creator li raccoglierà.