2009-04-05 8 views

risposta

196

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 
+6

Questa è la risposta corretta per questo post. – sivabudh

+3

+1 perché considera la soluzione multipiattaforma, la risposta più completa. – morde

+2

È 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

20

Stai utilizzando progetti qmake? In tal caso, è possibile aggiungere una libreria esterna utilizzando la variabile LIBS. E.g:

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

Ci scusiamo per domande scomode, ma la libreria psapi dovrebbe essere già stata creata o QtCreator si occuperà della sua creazione? – Dfr

5

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.

10

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 ;-)

+0

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

3

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

1

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:

  1. 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.

  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 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.

0

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à.