Mam program Linux Qt. Chciałbym, aby preferencyjnie używał (dynamicznych) bibliotek Qt w katalogu wykonywalnym, jeśli istnieją, w przeciwnym razie używał bibliotek Qt systemu. RPATH na ratunek.Ustawianie kolejności RPATH w QMake
dodać tę linię do qmake „s .pro plik:
QMAKE_LFLAGS += '-Wl,-rpath,\'\$$ORIGIN\''
i patrząc na wynikające wykonywalnego z readelf widzę:
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]
wydaje się słuszne, ale ldd pokazuje, że używa wersji systemu:
libQt5Core.so.5 => /usr/local/Trolltech/Qt-5.2.0/lib/libQt5Core.so.5 (0x00007f2d2fe09000)
Gdybym ręcznie edytować QMake wynikowym Makefile zamienić kolejność dwóch rpaths, więc $ ORIGIN przychodzi po/usr/local/..., ja uzyskać prawo zachowania:
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)
mój problem jest z tym, jak qmake konstruuje końcową zmienną LFLAGS. Nie mogę wymyślić, jak umieścić mój dodatek ($ ORIGIN) po bibliotece systemu. Jakieś pomysły?
Dlaczego wolisz preferować biblioteki lokalne nad bibliotekami systemowymi? W zwykłym scenariuszu wdrażania, w którym wysyłasz biblioteki z plikiem binarnym, masz tylko lokalny system lub lokalny. –
Nie zrobiłbym tego dla produktu produkcyjnego, ale jest użyteczny do debugowania, gdzie biblioteka lokalna ma dodatkowe wyjście diagnostyczne (na przykład). Zdaję sobie sprawę, że mogę użyć czegoś podobnego do LD_LIBRARY_PATH w skrypcie wrappera, ale spieszyłem się z tym króliczym otworem QMAke/RPATH, a teraz jestem ciekawy jak zrobić QMake, co chcę ... –