Chỉnh sửa: Tôi đã giải quyết vấn đề này, giải pháp bên dưới.Tại sao tôi không thể ghi đè đường dẫn tìm kiếm của thư viện động với LD_LIBRARY_PATH?
Tôi đang tạo mã trong một cụm máy tính dùng chung cho máy tính khoa học, do đó tôi chỉ có thể kiểm soát tệp trong thư mục chính của mình. Mặc dù tôi đang sử dụng fftw như một ví dụ, tôi muốn hiểu lý do cụ thể, tại sao nỗ lực của tôi để thiết lập LD_LIBRARY_PATH không hoạt động.
tôi xây dựng các thư viện fftw và fftw_mpi trong thư mục nhà của tôi như thế này
./configure --prefix=$HOME/install/fftw --enable-mpi --enable-shared
make install
Nó xây dựng tốt, nhưng trong cài đặt/fftw/lib, tôi thấy tươi xây dựng libfftw3_mpi.so liên kết đến phiên bản sai của thư viện fftw.
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f7df0979000)
Nếu bây giờ tôi cố gắng để thiết lập LD_LIBRARY_PATH chỉ đúng vào thư mục này, nó vẫn thích thư viện sai:
$ export LD_LIBRARY_PATH=$HOME/install/fftw/lib
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f32b4794000)
Chỉ khi tôi dứt khoát sử dụng LD_PRELOAD, tôi có thể ghi đè lên hành vi này. Tôi không nghĩ rằng LD_PRELOAD là một giải pháp thích hợp mặc dù.
$ export LD_PRELOAD=$HOME/install/fftw/lib/libfftw3.so.3
$ ldd libfftw3_mpi.so |grep fftw
$HOME/install/fftw/lib/libfftw3.so.3 (0x00007f5ca3d14000)
Đây là những gì tôi sẽ phải chờ đợi, một thử nghiệm nhỏ được thực hiện trong máy tính để bàn Ubuntu, nơi tôi cài đặt fftw đến/usr/lib đầu tiên, và sau đó ghi đè lên đường tìm kiếm này với LD_LIBRARY_PATH.
$ export LD_LIBRARY_PATH=
$ ldd q0test_mpi |grep fftw3
libfftw3.so.3 => /usr/lib/x86_64-linux-gnu/libfftw3.so.3
$ export LD_LIBRARY_PATH=$HOME/install/fftw-3.3.4/lib
$ ldd q0test_mpi |grep fftw3
libfftw3.so.3 => $HOME/install/fftw-3.3.4/lib/libfftw3.so.3
Tóm lại: Tại sao thư viện libfft3_mpi vẫn tìm thấy thư viện fftw3 động sai? Đường dẫn tìm kiếm này được mã hóa cứng ở đâu theo cách được ưu tiên hơn LD_LIBARY_PATH? Tại sao đây không phải là trường hợp trong một máy tính khác?
Tôi đang sử dụng các trình biên dịch intel 13.1.2, mkl 11.0.4.183 và openmpi 1.6.2 nếu điều này quan trọng.
Chỉnh sửa: Cảm ơn tất cả các câu trả lời. Với sự giúp đỡ của những người đó, chúng tôi đã có thể cô lập vấn đề với RPATH, và từ đó, sự hỗ trợ cụm đã có thể tìm ra vấn đề. Tôi chấp nhận câu trả lời đầu tiên, nhưng cả hai câu trả lời đều tốt.
Lý do, tại sao điều này rất khó tìm ra, là chúng tôi không biết rằng các trình biên dịch thực sự là các kịch bản trình bao bọc, thêm các thứ vào dòng lệnh trình biên dịch. Đây là một phần của thư trả lời từ sự hỗ trợ:
[Biên dịch] trải qua trình bao bọc trình biên dịch của chúng tôi. Chúng tôi thực hiện RPATH-ing theo mặc định vì nó giúp hầu hết người dùng chạy đúng công việc của mình mà không tải LD-LIBRARY_PATH v.v. Tuy nhiên, chúng tôi loại trừ một số đường dẫn thư viện nhất định từ RPATH mặc định bao gồm/lib,/lib64/proj /home v.v. Trước đó,/usr/lib64 không bị loại trừ do nhầm lẫn (chủ yếu). Bây giờ chúng ta đã thêm đường dẫn đó vào danh sách loại trừ.
Thật vậy, với chính mình, có vẻ như thực sự/usr/lib64 là trước/home/USER/install/fftw/lib trong biến được gọi là RPATH. Bây giờ vấn đề vẫn còn, đó là/usr/lib64 đã có trước/fftw/lib như thế nào. '$ readelf -d libfftw3_mpi.so | grep RPATH 0x000000000000000f (RPATH) Đường dẫn thư viện: [/software/intel/composer_xe_2013.4.183/compiler/lib/intel64:/usr/lib:/usr/lib/gcc/x86_64-redhat-linux/4.4.4:/usr/lib64:/home/USER/install/fftw/lib] ' –
rpath được thêm vào lúc biên dịch. Tôi không biết lib fftw nhưng có thể có cờ cấu hình '--disable-rpath'. để thay đổi đường chạy, bạn có thể sử dụng 'chrpath -r' để thay đổi đường đi trong thư viện –
bonoparte