Tôi đang cố gắng viết một hàm mex matlab sử dụng libhdf5; Cài đặt Linux của tôi cung cấp libhdf5-1.8 thư viện và tiêu đề được chia sẻ. Tuy nhiên, phiên bản Matlab của tôi, r2007b, cung cấp một libhdf5.so từ bản phát hành 1.6. (Matlab .mat
tệp bootstrap hdf5, hiển nhiên). Khi tôi biên dịch mex, nó phân tách trong Matlab. Nếu tôi hạ cấp phiên bản libhdf5 xuống 1.6 (không phải tùy chọn dài hạn), mã sẽ biên dịch và chạy tốt.địa điểm thư viện được chia sẻ cho các tệp matlab mex:
câu hỏi: làm cách nào để giải quyết vấn đề này? làm thế nào để tôi nói với quá trình biên dịch mex để liên kết với /usr/lib64/libhdf5.so.6 thay vì /opt/matlab/bin/glnxa64/libhdf5.so.0? Khi tôi cố gắng thực hiện việc này bằng cách sử dụng -Wl,-rpath-link,/usr/lib64
trong biên soạn của mình, tôi nhận được các lỗi như:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: warning: libhdf5.so.0, needed by /opt/matlab/matlab75/bin/glnxa64/libmat.so, may conflict with libhdf5.so.6
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
mex: link of 'hdf5_read_strings.mexa64' failed.
make: *** [hdf5_read_strings.mexa64] Error 1
ack. phương án cuối cùng sẽ là tải xuống một bản sao cục bộ của các tiêu đề hdf5-1.6.5 và được thực hiện với nó, nhưng đây không phải là bằng chứng trong tương lai (bản nâng cấp phiên bản Matlab là trong tương lai của tôi). bất kỳ ý tưởng?
EDIT: mỗi gợi ý tuyệt vời Ramashalanka, tôi
A) gọi là mex -v
để có được 3 gcc
lệnh; cuối cùng là lệnh linker;
B) được gọi là lệnh trình liên kết đó với -v
để nhận lệnh collect
;
C) được gọi là collect2 -v -t
và phần còn lại của cờ.
Các bộ phận có liên quan của đầu ra của tôi:
/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtbeginS.o
hdf5_read_strings.o
mexversion.o
-lmx (/opt/matlab/matlab75/bin/glnxa64/libmx.so)
-lmex (/opt/matlab/matlab75/bin/glnxa64/libmex.so)
-lhdf5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libhdf5.so)
/lib64/libz.so
-lm (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libm.so)
-lstdc++ (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so)
-lgcc_s (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libgcc_s.so)
/lib64/libpthread.so.0
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
-lgcc_s (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libgcc_s.so)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtendS.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crtn.o
Vì vậy, trên thực tế các libhdf5.so
từ /usr/lib64
đang được tham chiếu. Tuy nhiên, điều này đang được overriden, tôi tin rằng, bởi biến môi trường LD_LIBRARY_PATH
, phiên bản của tôi của Matlab automagically thiết lập tại thời gian chạy để nó có thể xác định vị trí các phiên bản riêng của nó ví dụ. libmex.so
, v.v.
Tôi nghĩ rằng ví dụ crt_file.c
hoạt động hoặc b/c nó không sử dụng chức năng tôi đang sử dụng (H5DOpen
, có thay đổi chữ ký trong di chuyển từ 1,6 đến 1,8 (vâng, tôi đang sử dụng -DH5_USE_16_API
)), hoặc, ít có khả năng, b/c nó không nhấn các phần của nội bộ Matlab cần hdf5. ack.
Trong đầu ra của bạn tôi thấy 'lib64/libhdf5.so' mà là một thư viện động. Bạn cần xác định đường dẫn rõ ràng cho thư viện tĩnh (với hậu tố .o) và không sử dụng '-lhdf5'. Sau đó, đăng đầu ra liên kết mới nếu nó vẫn không hoạt động. Nếu tệp '.so' là tệp duy nhất trong danh sách thì đó là tệp duy nhất được bao gồm. 'LD_LIBRARY_PATH' hoặc bất kỳ đường dẫn nào khác, chẳng hạn như trong' -L' không quan trọng nếu bạn không có '-lhdf5' làm tùy chọn và bạn chỉ định đường dẫn đến thư viện tĩnh một cách rõ ràng (xem bên dưới). Tôi đồng ý với ý kiến của bạn về 'h5_crtfile.c', nhưng tất cả thông tin chúng tôi cần đều nằm trong đầu ra liên kết của bạn ở trên. – Ramashalanka
Tôi không có tệp 'libhdf5.o'; Gói hdf5 của gentoo cung cấp 'libhdf5.so',' libhdf5.a', 'libhdf5.la' và một số tệp fortran và cpp. Tôi có phải tự biên dịch libhdf5 không? đây là một lựa chọn ... – shabbychef
Xin lỗi, ý tôi là '.a', không phải' .o'. Bạn có thể kiểm tra xem tệp 'libhdf5.a' bạn có là phiên bản chính xác hay không, ví dụ: 'strings libhdf5.a'. Tôi thấy 'HDF5 Version: 1.8.4' trong của tôi. Nếu bạn không thể nhận được thư viện tĩnh đúng như một nhị phân, nó rất dễ dàng để biên dịch. Xem nhận xét của tôi cho truy vấn khác của bạn bên dưới. – Ramashalanka