Come è possibile aggiungere una libreria esterna a un progetto creato da Qt Creator RC1 (versione 0.9.2)? Ad esempio, la funzione win32 EnumProcesses()
richiede Psapi.lib
da aggiungere nel progetto da compilare.Aggiunta di una libreria esterna nel progetto Qt Creator
risposta
Il modo corretto per farlo è come questo:
LIBS += -L/path/to -lpsapi
In questo modo funziona 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'). Naturalmente, se si include una lib specifica per Windows, questo non importa.
Nel caso in cui si desidera memorizzare i file lib nella directory del progetto, è possibile fare riferimento con la variabile $$_PRO_FILE_PWD_
, ad esempio:
LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi
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.
LIBS + = C: \ Program Files \ OpenCV \ lib
non funziona perché si utilizzano spazi vuoti in Programmi. In questo caso devi aggiungere virgolette, quindi il risultato sarà simile a questo: LIBS + = "C: \ Programmi \ OpenCV \ lib". raccomando librerie immissione in luoghi non bianco-spazio ;-)
Le versioni più recenti di Qt (Creator) vogliono sempre (singole) barre in avanti come separatore di directory.L'unica eccezione è quando si utilizza il comando "sistema" sotto Windows. Quindi è necessario alimentare il sistema con una barra rovesciata di escape, ovvero due barre all'indietro. Per sostituire tutte le barre inverse con due barre rovesciate si può fare come segue: 'WINDIR = $$ DIR',' WINDIR ~ = s, /, \\, g' – adlag
e di aggiungere più file di libreria è possibile 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/Ibrido E:/DebugLibrary/VTK/Imaging E:/DebugLibrary/VTK/IO E:/DebugLibrary/VTK/Parallel E:/DebugLibrary/VTK/Rendering E:/DebugLibrary/VTK/Utilities E:/DebugLibrary/VTK/rendering volumetrico E:/DebugLibrary/VTK/Widget E:/DebugLibrary/VTK/imballo
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 per distribuire la tua applicazione su macchine di clienti, piuttosto che utilizzare l'applicazione solo tu stesso, troviamo che il metodo LIBS+= -Lxxx -lyyy
può portare a confusione se non a problemi.
Sviluppiamo applicazioni per Linux, Mac e Windows utilizzando 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:
Noi non sappiamo esattamente ciò che il percorso del file è della biblioteca (statico o dinamico) che è stato trovato 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.
Non possiamo permetterci che il linker utilizzi i collegamenti simbolici alle librerie in quanto ciò interromperà il pacchetto di distribuzione.
Vogliamo vedere dal nome della libreria se colleghiamo una libreria statica o dinamica.
Quindi, per il nostro caso particolare, utilizziamo solo percorsi di file assoluti e controlliamo se esistono. Rimuoviamo tutti i collegamenti simbolici.
Per prima cosa scopriamo quale sistema operativo stiamo usando 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 copiati in pacchetto di distribuzione come sappiamo loro filepaths.
Vorrei aggiungere per il sacco della completezza che è possibile anche aggiungere solo il PERCORSO LIBRERIA dove cercherà una libreria dipendente (che potrebbe non essere referenziata direttamente nel codice ma una libreria che si utilizza 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 è venuto intorno a questo è la seguente:
LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"
In sostanza, se non si fornisce il nome della libreria vera e propria, si aggiunge il percorso in cui si cercherà librerie dipendenti. La differenza nella sintassi è 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à.
Questa è la risposta corretta per questo post. – sivabudh
+1 perché considera la soluzione multipiattaforma, la risposta più completa. – morde
È possibile specificare una variabile di ambiente come percorso di libreria? Ti sto chiedendo perché scrivere i nomi dei percorsi codificati nel file .pro si romperebbe se un progetto viene sviluppato da più persone che potrebbero non avere tutte le librerie installate nelle stesse posizioni. – antred