Tôi có chương trình Qt Linux. Tôi muốn nó ưu tiên sử dụng các thư viện Qt (động) trong thư mục thực thi nếu chúng tồn tại, nếu không hãy sử dụng các thư viện Qt của hệ thống. RPATH để giải cứu.Đặt thứ tự RPATH trong QMake
tôi thêm dòng này vào qmake 's tập tin .pro:
QMAKE_LFLAGS += '-Wl,-rpath,\'\$$ORIGIN\''
và nhìn vào thực thi kết quả với readelf tôi thấy:
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]
Có vẻ đúng, nhưng ldd cho biết họ đang sử dụng phiên bản hệ thống:
libQt5Core.so.5 => /usr/local/Trolltech/Qt-5.2.0/lib/libQt5Core.so.5 (0x00007f2d2fe09000)
Nếu tôi tự sửa qmake của kết quả Makefile để hoán đổi thứ tự của hai rpaths, vì vậy $ ORIGIN đưa ra sau khi usr/local/..., tôi nhận được hành vi đúng /:
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)
Vấn đề của tôi là với cách qmake tạo biến LFLAGS cuối cùng. Tôi không thể hiểu làm thế nào để làm cho nó đưa thêm của tôi ($ ORIGIN) sau khi thư viện hệ thống. Bất kỳ ý tưởng?
Tại sao bạn muốn sử dụng thư viện địa phương trên thư viện hệ thống? Trong một kịch bản triển khai thông thường, nơi bạn gửi thư viện với hệ nhị phân, bạn chỉ có địa phương hoặc hệ thống trên địa phương. –
Tôi sẽ không làm điều này cho một sản phẩm sản xuất, nhưng nó rất hữu ích để gỡ lỗi, nơi thư viện địa phương có một số đầu ra chẩn đoán thêm (ví dụ). Tôi nhận ra tôi chỉ có thể sử dụng một cái gì đó dọc theo dòng LD_LIBRARY_PATH trong một kịch bản wrapper, nhưng tôi scurried xuống lỗ thỏ QMAke/RPATH này, và bây giờ tôi tò mò về làm thế nào để làm cho QMake làm những gì tôi muốn ... –