Xerces-C 2.8: خطأ أثناء تحميل المكتبات المشتركة
سؤال
أحاول ترجمة برنامج يعمل على خادم HP UX على Linux Red Hat.
يستخدم مكتبة Xerces-C لتحليل ملفات XML. تجميع على ما يرام، ولكن عندما أحاول تشغيله، أحصل على الرسالة التالية
./a.out: خطأ أثناء تحميل المكتبات المشتركة: لا يمكن ل LIBXERCES-C.SO.28: فتح ملف كائن مشترك: لا يوجد مثل هذا الملف أو الدليل
كتبت برنامج بسيط للغاية لمحاولة فهم ما يحدث:
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/TransService.hpp>
#include <xercesc/parsers/SAXParser.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
int main(int argc, char* argv[])
{
return 0;
}
وأسمت ذلك مثل هذا:
g ++ test.cpp -l./xml/xerces-c_2_8_0/lib -lxerces-c -i./xml/xerces-c_2_8_0/Include
من المستغرب أن الملف هو في الواقع:
lib]$ ls
libxerces-c.a libxerces-c.so.28 libxerces-depdom.a libxerces-depdom.so.28
libxerces-c.so libxerces-c.so.28.0 libxerces-depdom.so libxerces-depdom.so.28.0
أي أفكار ؟ أشعر أنني أفتقد شيئا، لكن لا أعرف ماذا.
شكرا مقدما.
المحلول
يركض ldd a.out
ومعرفة ما إذا كان رابط يمكن حل الملف الصحيح .so
يصدر LD_LIBRARY_PATH
لتضمين المجلد الحالي (بنفس طريقة متغير المسار) والتحقق من LDD مرة أخرى
نصائح أخرى
الطريقة الجيدة للقيام بما تريده هو الوحيد التالي:
g++ test.cpp -Xlinker -R ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
أو
g++ test.cpp -Wl,-rpath ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
تتيح لك خيارات XLinker أو WL استخدام خيارات ربط محددة، لا تحتاج إلى modifiy ld_library_path
تحتاج إلى إخبار مكتبة وقت التشغيل C حيث يمكنك العثور على الرموز المختلفة التي تم تجميعها بشكل ثابت في الكود الخاص بك وتخلط في مواقع Usualy / Lib و / USR / Lib.
يمكنك القيام بذلك عن طريق إضافة المسار إلى مكتبة المشتركة الخاصة بك إلى LD_LIbrary_Path. في هذه الحالة، سيكون هذا ما كنت تضعه للحجة -l إلى المترجم.