Ho un programma Qt Linux. Mi piacerebbe utilizzare preferenzialmente le librerie Qt (dinamiche) nella directory dell'eseguibile, se esistono, altrimenti usare le librerie Qt del sistema. RPATH in soccorso.Impostazione dell'ordine RPATH in QMake
aggiungo questa linea al qmake s' del file .pro:
QMAKE_LFLAGS += '-Wl,-rpath,\'\$$ORIGIN\''
e guardando l'eseguibile risultante con readelf vedo:
0x000000000000000f (RPATH) Library rpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]
0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]
sembra giusto, ma ldd indica che sta utilizzando la versione di sistema:
libQt5Core.so.5 => /usr/local/Trolltech/Qt-5.2.0/lib/libQt5Core.so.5 (0x00007f2d2fe09000)
Se modifico manualmente qmake sta risultante Makefile per scambiare l'ordine delle due rpaths, quindi $ ORIGIN viene dopo// ..., ottengo il comportamento usr/local destra:
0x000000000000000f (RPATH) Library rpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]
0x000000000000001d (RUNPATH) Library runpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]
libQt5Core.so.5 => ./libQt5Core.so.5 (0x00007fb92aba9000)
Il mio problema è con come qmake costruisce la variabile finale LFLAGS. Non riesco a capire come farlo mettere la mia aggiunta ($ ORIGIN) dopo la libreria di sistema. Qualche idea?
Perché preferisci preferire le librerie locali alle librerie di sistema? In un normale scenario di distribuzione in cui vengono spedite le librerie con il binario, si ha solo locale o sistema su locale. –
Non lo farei per un prodotto di produzione, ma è utile per il debug, dove la libreria locale ha un output diagnostico extra (per esempio). Mi rendo conto che posso semplicemente usare qualcosa sulla linea di LD_LIBRARY_PATH in uno script di wrapper, ma mi sono precipitato giù nella tana del coniglio QMAke/RPATH, e ora sono curioso di sapere come fare QMake a fare quello che voglio ... –