2009-11-23 34 views
13

Tôi có một ứng dụng được chia thành nhiều thư viện để phục vụ cho việc tái sử dụng mã. Trên Windows tất cả tôi phải làm là đặt các tập tin .dll trong cùng một đường dẫn như thực thi và nó sẽ tự động tìm thấy chúng. Trên Linux (vì nó mã hóa đường dẫn đến mọi thứ), tôi phải chỉ định biến môi trường LD_LIBRARY_PATH hoặc tải trước các thư viện trước khi thực thi.Đường dẫn Thư viện được chia sẻ làm Thư mục thực thi

Tôi đã nhìn thấy một số điều về cách nhúng đường dẫn bằng tùy chọn trình liên kết của -Wl,-rpath=<PATH> và tôi đã thử sử dụng đường dẫn này .. Nhưng điều đó chỉ nhìn vào thư mục làm việc hiện tại, không phải thư mục thực thi.

Có cách nào để chỉ định trong trình liên kết để xem trong thư mục của tệp thực thi cho các thư viện được chia sẻ theo mặc định (như trên Windows) không?

Cảm ơn! Matt

Trả lời

18

Bạn cần $ ORIGIN trong RPATH của bạn, thông qua tùy chọn thích hợp để ld hoặc công cụ Darwin khác. Xem thisthis.

Hãy nhớ rằng $ đã thực sự kết thúc trong đường dẫn, vì vậy bạn cần báo giá hoặc thoát khỏi nó trong dòng lệnh liên kết.

Cập nhật: Bạn có thể xem những gì các mối liên kết thực sự đưa vào thực thi của bạn với

readelf -d /path/to/exe | grep RPATH 

Đây là những gì đầu ra sẽ giống như thế:

0x0000000f (RPATH)    Library rpath: [$ORIGIN] 
+4

Khi sử dụng $ ORIGIN, bạn cần đảm bảo rằng $ được trích dẫn đúng cách để trình liên kết thực sự nhìn thấy nó. Từ dòng lệnh, bạn muốn "-rpath \ $ ORIGIN" và từ Makefile bạn muốn "-rpath \ $$ ORIGIN" –

+0

Tôi đang sử dụng Eclipse và CDT, và tôi đang đặt tùy chọn trong các cờ liên kết linh tinh. Tôi đang đặt '-Wl, -rpath = $$ ORIGIN' và trong cửa sổ đầu ra nó hiển thị nó với một $ duy nhất. Nhưng nó dường như không hoạt động. Tôi đã thử một số biến thể, nhưng không có gì xảy ra. Nó giống như mối liên kết chỉ bỏ qua lá cờ. Tôi đã thử: -Wl, -rpath = $ ORIGIN -Wl, - rpath = $ ORIGIN -Wl, -rpath =/$ ORIGIN -Wl, -rpath = $ ORIGIN/ -Wl, -rpath =/$ ORIGIN/ v.v. – CuppM

+0

Sử dụng elfdump hoặc tương đương cục bộ để xem nội dung trong đó? Sử dụng ldd và xem những gì nó nói? – bmargulies

2

Quấn chương trình của bạn trong một kịch bản shell:

#!/bin/sh 

PROGRAM_DIRECTORY="`dirname "$0"`" 
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY" 

"$PROGRAM_DIRECTORY/program_executable" "[email protected]" 

Nếu bạn chạy tập lệnh này (thay vì thực thi) y chương trình của chúng tôi sẽ liên kết tốt.

+0

Vâng, đó là những gì tôi đã làm và nó hoạt động. Ứng dụng này có phiên bản song song bằng cách sử dụng OpenMPI và có cách chia sẻ LD_LIBRARY_PATH. Vì vậy, chúng tôi hiện đang sử dụng cách giải quyết đó, nhưng chúng tôi muốn cách làm việc dễ dàng hơn vì ứng dụng (cũng như người chạy MPI) mất nhiều cờ để xử lý – CuppM

+0

Bạn có thể chuyển tất cả các đối số từ tập lệnh của bạn lên chương trình '" $ @ "'. –

Các vấn đề liên quan