كيف تجبر التعزيز على استخدام RPATH؟
-
26-09-2019 - |
سؤال
لا بد لي من بناء دفعة خارج شجرة الدليل "المعتادة" (أي ، /custom/dir
بدلاً من /usr
) ، وهي ليست مشكلة كبيرة: فقط مرور --prefix=/custom/path
ل ./runscript.sh
/ ./bjam
, ، وهناك تذهب.
او كذلك ظننت انا.
المشكلة هي أن بعض مكتبات التعزيز تعتمد على بعضها البعض ، و - باستخدام عملية الإنشاء الافتراضية التي تمر بها ./bootstrap.sh
/ ./bjam
- يبدو أن --prefix
لا تتم إضافة المسار إلى مسار البحث في المكتبة عن libs التعزيز ، أي لا -Wl,-rpath
يتم تطبيقه. هذا يعني أن تعزيز المكتبات اعتمادًا على مكتبات التعزيز الأخرى لا يمكنها العثور على تلك الموجودة في وقت التشغيل.
طلبي - ربط هؤلاء /custom/path
تعزيز المكتبات - فشل بالفعل في ./configure
مرحلة لأن libboost_filesystem.so
غير قادر على إيجاد libboost_system.so
, بالرغم من لقد نجحت -Wl,-rpath=/custom/path/boost/lib
إلى خط المترجم الخاص بي (أي المسار الصحيح إلى LIBS ، قمت بالتحقق من ذلك libboost_system.so
هل هناك).
الآن ، لتجنب الأساليب الثقيلة مثل الإعداد LD_LIBRARY_PATH
, ، أرغب في بناء دفعة بطريقة ما بحيث يكون لجميع مكتبات Boost مسار البحث المناسب عن LIBs المعززة الأخرى التي تم تجميعها فيها. ومع ذلك ، لم أتمكن من العثور على الإجراء المناسب لذلك. أي شخص يمكن أن تساعدني؟
المحلول
كنت بحاجة إلى القيام بذلك مؤخرًا لمشروع آخر ، على الرغم من أنني بحاجة إلى استخدام $ Origin لجعل المسار بالنسبة لموقع الكائنات المشتركة لـ Boost.
هذا يتطلب ما يلي على سطر أوامر باش:
./b2 hardcode-dll-paths=true dll-path="'\$ORIGIN/../lib'" --prefix=$MY_PREFIX install
إن اكتشاف المجموعة السحرية من الشخصيات للحصول على هذا الأصل $ الذي تم وضعه بشكل صحيح في الكائن المشترك استغرق بعض التجربة والخطأ ، لذلك آمل أن يساعد كتابة الإجابة هنا على تجنب التناهيض مع هذا.
نصائح أخرى
يمكنك إضافة خيارات برنامج التحويل البرمجي والرابط أثناء الإنشاء من سطر الأوامر مع:
bjam hard-code-dll-path=true dll-path=/custom/path
يوجد عنصر الأسئلة الشائعة في مستندات Boost Build حول هذا (انظر مستندات B2).