2010-03-20 15 views
10

Tôi đang xây dựng một ứng dụng C++ sử dụng thư viện IPP của Intel. Thư viện này được cài đặt theo mặc định trong/opt và yêu cầu bạn đặt LD_LIBRARY_PATH cả để biên dịch và chạy phần mềm của bạn (nếu bạn chọn liên kết thư viện được chia sẻ, mà tôi đã làm). Tôi đã sửa đổi configure.ac/Makefile.am của mình để tôi không cần đặt biến đó khi biên dịch, nhưng tôi vẫn không thể tìm thấy thư viện được chia sẻ trong thời gian chạy; Làm thế nào để làm điều đó?Làm cách nào để loại bỏ LD_LIBRARY_PATH tại thời gian chạy?

Tôi đang biên soạn với -Wl, -R/path/to/libdir cờ sử dụng g++

Cập nhật 1: Trên thực tế chương trình nhị phân của tôi đã một số thư viện IPP liên kết một cách chính xác, nhưng chỉ cần một là không:

$ ldd myprogram 
linux-vdso.so.1 => (0x00007fffa93ff000) 
libippacem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippacem64t.so.6.0 (0x00007f22c2fa3000) 
libippsem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippsem64t.so.6.0 (0x00007f22c2d20000) 
libippcoreem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippcoreem64t.so.6.0 (0x00007f22c2c14000) 
[...] 
libiomp5.so => not found 
libiomp5.so => not found 
libiomp5.so => not found 

Dĩ nhiên thư viện ở đó:

$ locate libiomp5.so 
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so 
+0

Tôi có thể cần phải thay đổi câu hỏi thành một thứ khác, nhưng tôi cần đề xuất, tôi viết tắt ý tưởng – Kjir

+0

Hm, tôi tự hỏi có phải trùng hợp ngẫu nhiên là người đó cũng thiếu tiện ích mở rộng số phiên bản cài đặt chính nó phải không? – Cascabel

+2

Tôi tự hỏi nếu thư viện bị bỏ lỡ không được tham chiếu đến chương trình của bạn, mà là bởi các thư viện mà bạn tham khảo? –

Trả lời

2

Theo gợi ý của Richard Pennington, thư viện bị thiếu không được ứng dụng của tôi sử dụng trực tiếp, nhưng nó được sử dụng bởi các thư viện được chia sẻ mà tôi sử dụng. Vì tôi không thể biên dịch lại IPP, giải pháp cho vấn đề của tôi là thêm -liomp5 khi biên dịch, sử dụng tùy chọn -R cho trình liên kết. Điều này thực sự thêm rpath cho libiomp5.so sửa chữa vấn đề!

-1

bash:

export LD_LIBRARY_PATH=/path/to/lib 

tcsh:

setenv LD_LIBRARY_PATH /path/to/lib 
+0

Câu hỏi đặt ra là cách * không * phải đặt LD_LIBRARY_PATH chứ không phải cách đặt nó. Đây là một câu hỏi rất hợp lý, vì việc thiết lập LD_LIBRARY_PATH có thể khá xấu. – Cascabel

4

By /path/to/lib Ý anh là đường dẫn đến thư mục chứa các thư viện, hoặc đường dẫn đến tập tin thực tế?

Tùy chọn -R cho đối số thư mục được xử lý như -rpath bởi ld, là tùy chọn bạn thực sự muốn ở đây. Nó thêm thư mục đã cho vào đường dẫn tìm kiếm thư viện thời gian chạy. Điều đó sẽ hoạt động, miễn là bạn đưa cho nó thư mục chứ không phải tên tệp. Tôi khá tự tin về điều đó, sau khi thực hiện nó bản thân mình, và bởi vì nó là một trong những gợi ý do libtool:

Libraries đã được lắp đặt tại:

/path/to/thư viện thư mục

Nếu bạn muốn liên kết với thư viện đã cài đặt trong thư mục đã cho, LIBDIR, bạn phải sử dụng libtool và chỉ định tên đường dẫn đầy đủ của thư viện hoặc sử dụng cờ `-LLIBDIR ' trong khi liên kết và thực hiện ít nhất một trong những điều sau:

  • thêm LIBDIR đến LD_LIBRARY_PATH ` 'biến môi trường trong quá trình thực
  • thêm LIBDIR đến LD_RUN_PATH`' biến môi trường trong liên kết
  • gõ `-Wl, -rpath -Wl, LIBDIR' mối liên kết cờ
  • yêu cầu quản trị viên hệ thống của bạn thêm LIBDIR vào `/etc/ld.so.conf'

(tôi dán này ở đây kể từ khi hình dung một trong những lựa chọn khác có thể được mong muốn hơn - ví dụ LD_RUN_PATH có thể giúp bạn tiết kiệm sửa đổi makefile)

+0

Tôi đã sửa đổi câu hỏi để xác định rõ hơn rằng tôi thực sự trỏ đến một thư mục. Thêm tùy chọn đó vào giai đoạn liên kết đã thực sự giải quyết vấn đề tại thời gian biên dịch, nhưng thời gian chạy vẫn không hoạt động. Tất nhiên tôi đã làm 'làm sạch && make' để chắc chắn rằng tôi đã cập nhật các tập tin nhị phân ... – Kjir

+0

Bạn có thể thử tuyến đường 'LD_RUN_PATH', chỉ trong trường hợp? – Cascabel

2

Bạn có thể kiểm tra xem đường dẫn đến thư viện là được chọn từ cờ -R của bạn bằng cách chạy lệnh ldd hoặc lệnh readelf trên nhị phân của bạn. Biến môi trường LD_LIBRARY_PATH là ghi đè, vì vậy không cần thiết bình thường.

-1

Hãy thử định cấu hình ldconfig của bạn thông qua ld.so.conf để tìm kiếm thư mục /opt/... theo mặc định.

+2

Đó không phải là một lựa chọn khả thi, nó sẽ giống như thiết lập LD_LIBRARY_PATH, nhưng có thể ít cầm tay hơn. Ngoài ra nó sẽ yêu cầu một nhiệm vụ quản trị, mà không giải quyết được vấn đề chính, mà là làm cho không đau càng tốt cho người dùng/nhà phát triển tiếp theo để chạy phần mềm. – Kjir

0

Bạn nên sử dụng tùy chọn -R nếu có thể.

Nếu không, hãy đổi tên tệp thi hành của bạn và tạo tập lệnh khởi chạy chạy tệp thi hành của bạn và trong đó đặt LD_LIBRARY_PATH chỉ cho phạm vi đó.

Tùy thuộc vào nền tảng, bạn có thể sửa đổi ld.so.conf qua /etc/ld.so.conf.d (Redhat/Fedora), điều này làm cho việc triển khai thay đổi thành ld.so "dễ dàng hơn" từ kịch bản triển khai .

+0

Bạn đã xem thông tin đã được đăng chưa?OP * là * sử dụng tùy chọn '-R'; vấn đề là nó không hoạt động như mong đợi. Và sửa đổi ld.so.conf giống như thiết lập LD_LIBRARY_PATH, ngoại trừ thậm chí tệ hơn - nó áp dụng cho mọi thứ, không chỉ chương trình này, và triển khai theo cách luôn yêu cầu root không dễ dàng hơn. – Cascabel

+0

Ngoài ra, mặc dù một kịch bản trình bao sẽ hoạt động, nhưng nó không chỉ là không thích hợp, nhưng trong một số trường hợp có thể xảy ra, nó có thể là vấn đề - nếu chương trình được đề cập khởi chạy các chương trình khác, chúng sẽ kế thừa biến môi trường đó mở lại các sự cố thường gặp với LD_LIBRARY_PATH một lần nữa. – Cascabel

+0

Tôi không nói chúng là giải pháp tốt, nhưng nếu người dùng cuối đang cài đặt các thành phần thời gian chạy là phụ thuộc và không được thêm vào phương pháp tra cứu của hệ thống, thì các tùy chọn của bạn rất hạn chế. Về cơ bản chỉ có hai cách để tìm libs động bên ngoài các giá trị mặc định - bạn cập nhật ld.so hoặc bạn sử dụng LD_LIBRARY_PATH (hoặc LD_RUN_PATH) ở một số dạng. – Joe

0

Bên cạnh tất cả các gợi ý hữu ích được đăng ở đây .. bạn không cố gắng sử dụng thư viện 64 bit cụ thể trên hệ thống 32 bit (hoặc ngược lại, tùy thuộc vào các điều kiện khác), phải không?

+0

Nếu như vậy, nó sẽ không hoạt động ngay cả khi thiết lập LD_LIBRARY_PATH ... – Kjir