مواقع المكتبة المشتركة لملفات MATLAB MEX:
سؤال
أحاول كتابة وظيفة MATLAB MEX التي تستخدم liBHDF5 ؛ يوفر تثبيت Linux الخاص بي LIBHDF5-1.8 المكتبات والرؤوس المشتركة. ومع ذلك ، فإن الإصدار الخاص بي من MATLAB ، R2007B ، يوفر LIBHDF5.SO من الإصدار 1.6. (ماتلاب .mat
ملفات bootstrap HDF5 ، من الواضح). عندما أقوم بتجميع MEX ، فإنه يتصاعد في MATLAB. إذا قمت بتخفيض نسختي من libhdf5 إلى 1.6 (وليس خيارًا طويل الأجل) ، فإن الكود يجمع ويعمل بشكل جيد.
سؤال: كيف يمكنني حل هذه المشكلة؟ كيف يمكنني إخبار عملية تجميع MEX بالربط مع /usr/lib64/libhdf5.so.6 بدلاً من /opt/matlab/bin/glnxa64/libhdf5.so.0؟ عندما أحاول القيام بذلك باستخدام -Wl,-rpath-link,/usr/lib64
في مجموعتي ، أحصل على أخطاء مثل:
/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. سيكون الملاذ الأخير هو تنزيل نسخة محلية من رأس HDF5-1.6.5 ويتم القيام به ، ولكن هذا ليس دليلًا مستقبليًا (ترقية إصدار MATLAB في مستقبلي). أيه أفكار؟
تحرير: اقتراحات رامشالانكا الممتازة ، أنا
أ) دعا mex -v
للحصول على 3 gcc
أوامر ؛ الأخير هو أمر الرابط ؛
ب) يسمى الأمر الرابط مع أ -v
للحصول على collect
أمر؛
ج) دعا ذلك collect2 -v -t
وبقية الأعلام.
الأجزاء ذات الصلة من مخرجتي:
/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
لذلك ، في الواقع libhdf5.so
من عند /usr/lib64
يجري الرجوع إليها. ومع ذلك ، فإن هذا يجري تجاوزه ، على ما أعتقد ، من قبل متغير البيئة LD_LIBRARY_PATH
, ، والتي تقوم نسختي من MATLAB بشكل تلقائي في وقت التشغيل حتى يتمكن من تحديد موقع إصداراتها الخاصة من EG libmex.so
, ، إلخ.
أنا أفكر في أن crt_file.c
مثال يعمل إما b/c لا يستخدم الوظائف التي أستخدمها (H5DOpen
, ، الذي كان لديه تغيير توقيع في الانتقال من 1.6 إلى 1.8 (نعم ، أنا أستخدم -DH5_USE_16_API
) ، أو ، أقل احتمالا ، ب/ج أنه لا يضرب أجزاء من MATLAB الداخلية التي تحتاج إلى HDF5. ACK.
المحلول
ما يلي عمل على نظامي:
قم بتثبيت HDF5 الإصدار 1.8.4 (لقد قمت بذلك بالفعل: لقد قمت بتثبيت المصدر وتجميعها للتأكد من أنه متوافق مع نظامي ، وأحصل على إصدارات GCC وأن أحصل على المكتبات الثابتة - على سبيل المثال الثنائيات المقدمة لنظامي هي
icc
محدد).قم بعمل ملف مستهدف. لديك بالفعل ملفك الخاص. لقد استخدمت البسيطة
h5_crtfile.c
من عند هنا (فكرة جيدة للبدء بهذا الملف البسيط أولاً بحث عن تحذيرات). لقد تغيرتmain
لmexFunction
مع args المعتادة وشملتmex.h
.حدد ال ثابتة 1.8.4 المكتبة التي تريد تحميلها بشكل صريح (المسار الكامل مع عدم وجوده لضروري) ولا تشمل
-lhdf5
في الLDFLAGS
. تشتمل علي-t
الخيار حتى تتمكن من التأكد من عدم تحميل مكتبة HDF5 ديناميكية. ستحتاج أيضا-lz
, ، معzlib
المثبتة. لداروين نحتاج أيضا-bundle
فيLDFLAGS
:mex CFLAGS='-I/usr/local/hdf5/include' LDFLAGS='-t /usr/local/hdf5/lib/libhdf5.a -lz -bundle' h5_crtfile.c -v
بالنسبة إلى Linux ، تحتاج إلى مكالمة معادلة مستقلة عن الموضع ، على سبيل المثال
fPIC
و ربما-shared
, ، لكن ليس لدي نظام Linux مع ترخيص MATLAB ، لذلك لا يمكنني التحقق من:mex CFLAGS='-fPIC -I/usr/local/hdf5/include' LDFLAGS='-t /usr/local/hdf5/lib/libhdf5.a -lz -shared' h5_crtfile.c -v
تشغيل
h5_crtfile
ملف MEX. هذا يعمل دون مشاكل على الجهاز الخاص بي. إنه يقوم فقط بـ H5Fcreate و H5Fclose لإنشاء "file.h5" في الدليل الحالي ، وعندما أتصلfile file.h5
انا حصلتfile.h5: Hierarchical Data Format (version 5) data
.
لاحظ أنه إذا قمت بتضمين أ -lhdf5
أعلاه في الخطوة 3 ، ثم يتم إحباط MATLAB عندما أحاول تشغيل القابلة للتنفيذ (لأنه يستخدم بعد ذلك مكتبات MATLAB الديناميكية التي هي بالنسبة لي هي الإصدار 1.6.5) ، لذلك هذا بالتأكيد يحل المشكلة على نظامي.
شكرا على السؤال. إن حلي أعلاه هو بالتأكيد أسهل بالنسبة لي مما كنت أفعله من قبل. نأمل أن يكون ما سبق من أجلك.
نصائح أخرى
أنا أقبل إجابة Ramashalanka لأنها قادتني إلى الحل الدقيق الذي سأنشره هنا للاكتمال فقط:
- قم بتنزيل مكتبة HDF5-1.6.5 من موقع HDF5 ، وتثبيت ملفات الرأس في دليل محلي ؛
- أخبر MX بالبحث عن "HDF5.h" في هذا الدليل المحلي ، وليس في الموقع القياسي (على سبيل المثال
/usr/include
.) - أخبر MX لتجميع الكود الخاص بي ومكتبة الكائن المشتركة التي توفرها MATLAB, ، وافعل ليس استخدم ال
-ldfh5
العلم فيLDFLAGS
.
الأمر الذي استخدمته هو ، بشكل أساسي:
/opt/matlab/matlab_default/bin/mex -v CC#gcc CXX#g++ CFLAGS#"-Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include" CXXFLAGS#"-Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include " -O -lmwblas -largeArrayDims -L/usr/lib64 hdf5_read_strings.c /opt/matlab/matlab_default/bin/glnxa64/libhdf5.so.0
يتم ترجمة هذا بواسطة MEX إلى الأوامر:
gcc -c -I/opt/matlab/matlab75/extern/include -DMATLAB_MEX_FILE -Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include -O -DNDEBUG hdf5_read_strings.c
gcc -c -I/opt/matlab/matlab75/extern/include -DMATLAB_MEX_FILE -Wall -O3 -fPIC -I./hdf5_1.6.5/src -I/usr/include -I/opt/matlab/matlab_default/extern/include -O -DNDEBUG /opt/matlab/matlab75/extern/src/mexversion.c
gcc -O -pthread -shared -Wl,--version-script,/opt/matlab/matlab75/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -o hdf5_read_strings.mexa64 hdf5_read_strings.o mexversion.o -lmwblas -L/usr/lib64 /opt/matlab/matlab_default/bin/glnxa64/libhdf5.so.0 -Wl,-rpath-link,/opt/matlab/matlab_default/bin/glnxa64 -L/opt/matlab/matlab_default/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++
يجب أن يعمل هذا الحل على جميع أجهزتي المستهدفة المختلفة وعلى الأقل حتى أقوم بالترقية إلى MATLAB R2009A ، والتي أعتقد أنها تستخدم HDF5-1.8. شكرًا على كل المساعدة ، آسف لكوني كثيفًا جدًا مع هذا-أعتقد أنني كنت ملزمًا بشكل مفرط لاستخدام الإصدار المعبأ من HDF5 ، بدلاً من مجموعة محلية من ملفات الرأس.
لاحظ أن هذا سيكون تافهاً إذا قدم Mathworks مجموعة من ملفات الرأس مع توزيع MATLAB ...