Vorrei includere libQtGui.so.4 libQtNetwork.so.4 e libQtCore.so.4 nella stessa directory in cui si trova la mia app. Come potrei far capire a Qt questo? Lo scopo è di avere un'app standalone che usi le librerie condiviseCome posso impostare dove un'app Qt trova un modulo Qt?
risposta
L'impostazione della variabile di ambiente LD_LIBRARY_PATH è un'opzione. Ad esempio:
export LD_LIBRARY_PATH=/path/to/dir/with/libs:$LD_LIBRARY_PATH
Un'altra opzione è impostare il RPATH dell'applicazione Qt durante il collegamento. Impostando RPATH sul valore "$ ORIGIN", il linker dinamico cercherà nella stessa directory dell'applicazione Qt in fase di runtime. Ad esempio, se si utilizza qmake, aggiungere il seguente frammento di codice al file di progetto:
unix:!mac{
QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN
QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN/lib
QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN/libs
QMAKE_RPATH=
}
Questo imposterà la RPATH a "$ ORIGIN: $ ORIGIN/lib: $ ORIGIN/libs", il che significa che il linker dinamico per prima cosa cercate nella posizione dell'applicazione Qt, quindi in una sottodirectory lib nella sua posizione, quindi in una sottodirectory libs nella sua posizione e infine in qualsiasi posizione definita dal sistema.
non sembra funzionare. –
Ecco l'output di compilazione: "g ++: opzione non riconosciuta '-wl, - rpath = $ ORIGIN'" "g ++: opzione non riconosciuta '-wl, - rpath = $ ORIGIN/lib'" "g ++: opzione non riconosciuta '- wl, - rpath = $ ORIGIN/libs '" –
rimosse quelli manualmente nel Makefile direttamente, premetti di nuovo tutto, poi passò ... ora per provarlo. –
UNIX/Linux sta andando a cercare in LD_LIBRARY_PATH (se impostato) prima di cercare nelle librerie standard del sistema. Quindi, se lo imposti, puoi davvero scavalcare. Proprio come impostare PATH su Windows. Stesso effetto L'ordine conta.
È possibile aggiungere ./ o. anche a LD_LIBRARY_PATH.
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
L'ho provato e non funziona. Sono entrato nel progetto e ho cambiato LD_LIBRARY_PATH in. ma nulla è cambiato quando sono tornato al terminale e ho digitato ldd ./MyApp ... Sto costruendo dalla GUI ... dovrei provare dalla riga di comando? –
LD_LIBRARY_PATH
e QMAKE_RPATH
non ha mai funzionato per me. Invece, ho impostato QMAKE_RPATHDIR
nel mio file .pro
. Ad esempio, dopo aver creato e installato (make install
) Qt, è stato inserito in /usr/local/Trolltech/Qt-4.8.5/lib/
. Ho poi scrivere nel mio file .pro
:
QMAKE_RPATHDIR += /usr/local/Trolltech/Qt-4.8.5/lib/
Nota 1: I percorsi relativi sembrano non funzionare. Preferisci percorsi assoluti.
Nota 2: Quando si allora make
, si può vedere che la seguente opzione è dato al linker: -Wl,-rpath,/usr/local/Trolltech/Qt-4.8.5/lib/
Nota 3: Per essere sicuri che i collegamenti binari dinamicamente alla libreria corretta, è possibile visualizzare il versione di Qt in fase di esecuzione fornita da qVersion()
.
è anche possibile decidere di collegare staticamente le librerie Qt, in questo modo non si dipenderà dalla versione Qt locale installata (questo è il modo in cui Opera lo ha usato in Linux) – sisis
Problema con il collegamento statico sulla piattaforma I am la distribuzione su fontconfig è buggata (red Hat 5.3 usa fontconfig 2.4.1) –
quando provo a creare staticamente c'è un riferimento indefinito a FcTypeFreeQueryFace e quando provo ad aggiornare fontconfig mi dice che fontconfig è aggiornato ... ..bummer..then Devo trovare un modo per modificare i file Qt da compilare con una versione di fontconfig che fornisco. Sono in grado di creare la mia app in modo dinamico con un fontconfig fornito ma non staticamente. –