سؤال

أحاول كتابة وظيفة 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.

هل كانت مفيدة؟

المحلول

ما يلي عمل على نظامي:

  1. قم بتثبيت HDF5 الإصدار 1.8.4 (لقد قمت بذلك بالفعل: لقد قمت بتثبيت المصدر وتجميعها للتأكد من أنه متوافق مع نظامي ، وأحصل على إصدارات GCC وأن أحصل على المكتبات الثابتة - على سبيل المثال الثنائيات المقدمة لنظامي هي icc محدد).

  2. قم بعمل ملف مستهدف. لديك بالفعل ملفك الخاص. لقد استخدمت البسيطة h5_crtfile.c من عند هنا (فكرة جيدة للبدء بهذا الملف البسيط أولاً بحث عن تحذيرات). لقد تغيرت main ل mexFunction مع args المعتادة وشملت mex.h.

  3. حدد ال ثابتة 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
    
  4. تشغيل 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 لأنها قادتني إلى الحل الدقيق الذي سأنشره هنا للاكتمال فقط:

  1. قم بتنزيل مكتبة HDF5-1.6.5 من موقع HDF5 ، وتثبيت ملفات الرأس في دليل محلي ؛
  2. أخبر MX بالبحث عن "HDF5.h" في هذا الدليل المحلي ، وليس في الموقع القياسي (على سبيل المثال /usr/include.)
  3. أخبر 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 ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top