سؤال

أحاول ترجمة برنامج يعمل على خادم 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 إلى المترجم.

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