2010-03-23 3 views
10

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?

+0

è 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

+0

Problema con il collegamento statico sulla piattaforma I am la distribuzione su fontconfig è buggata (red Hat 5.3 usa fontconfig 2.4.1) –

+0

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

risposta

8

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.

+0

non sembra funzionare. –

+0

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 '" –

+0

rimosse quelli manualmente nel Makefile direttamente, premetti di nuovo tutto, poi passò ... ora per provarlo. –

0

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

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? –

0

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