Tôi cần phải xây dựng hai thư viện chia sẻ của bên thứ ba, vì vậy các tệp .so của chúng sẽ được các dự án khác sử dụng lại. Tuy nhiên, sau khi xây dựng một trong các thư viện này có chứa đường dẫn mã hóa cứng khác. Đường dẫn này không hợp lệ trên các máy khác và gây cảnh báo liên kết. Làm thế nào tôi có thể ngăn chặn đường dẫn đầy đủ từ được nhúng trong các tập tin .so kết quả?Làm thế nào để xây dựng một thư viện được chia sẻ (.so) mà không có đường dẫn phụ thuộc đầy đủ được mã hóa cứng?
chi tiết:
Đầu thư viện nguồn: ~/dev/A
nguồn thư viện thứ hai: ~/dev/B
Cả hai đều có configure
kịch bản để tạo ra làm cho tập tin. Thư viện B
tùy thuộc vào A
. Vì vậy, lần đầu tiên tôi xây dựng A
:
$ ~/dev/A/configure --prefix=~/dev/A-install
$ make && make install
Sau đó, tôi xây dựng B
:
$ ~/dev/B/configure --prefix=~/dev/B-install --with-A=~/dev/A-install
$ make && make install
Sau đó, tôi muốn tải lên nội dung của ~/dev/A-install
và ~/dev/B-install
đến máy chủ tập tin của chúng tôi, vì vậy các đội khác và xây dựng máy có thể sử dụng các tệp nhị phân. Nhưng họ nhận được lời cảnh báo mối liên kết khi họ cố gắng sử dụng B
:
/usr/bin/ld: warning: libA.so.2, needed by /.../deps/B/lib/libB.so, not found (try using -rpath or -rpath-link)
Khi tôi chạy ldd libB.so
nó mang lại:
...
libA.so.2 => /home/alex/dev/A-install/lib/libA.so.2
Rõ ràng con đường này chỉ tồn tại trên máy tính của mình và không thể được tìm thấy trên các máy khác.
Tôi làm cách nào để xóa đường dẫn được mã hóa đầy đủ khỏi libB.so
?
Cảm ơn.
Làm cách nào để bạn liên kết? Với libtool? Trong trường hợp đó 'patchelf' có thể giúp bạn loại bỏ đường dẫn được mã hóa (RPATH). –
Tại sao không sử dụng tiền tố không phụ thuộc vào môi trường của bạn, tức là '~'? Tại sao không sử dụng một cái gì đó như nói '/ opt' là tiền tố mà không phụ thuộc vào biến môi trường như' $ HOME' ('~')? Bạn có thể thử ['LD_PRELOAD'] (http://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick) có lẽ –
Lý tưởng nhất là bạn có thể thay đổi tập lệnh' configure' để ngăn chặn vấn đề này. Nếu bạn muốn chỉnh sửa các thư viện, tôi đã nghe những điều tốt đẹp về elfsh (http://www.eresi-project.org). – Beta