سؤال

لدي برنامج (على وجه التحديد دخولي ل لتحدي التطبيق Devdays العد التنازلي) والتي تعتمد على العديد من المكتبات الديناميكية، وهي LIBSDL و LIBSDL_TTF وغيرها. لدي هذه المكتبات مثبتة تحت /opt/local/lib عبر macports، ولن يكون لدى الكثير من الناس هذه المثبتة (وقد يكون لهم البعض مثبتا، ولكن ليس في هذا الموقع).

كيف يمكنني توزيع برنامجي بحيث يمكن تثبيت الأشخاص دون هذه المكتبات تشغيله خارج المربع؟ من الواضح أنني سوف تضطر إلى توزيع مختلف .dylib الملفات، ولكن القيام بذلك غير كافية. لا يزال اللودر الديناميكي يبحث عن المكتبات المثبتة في المواقع التي قمت بتثبيتها في. هل هناك طريقة لإخبار محمل ديناميكي أن ننظر في الدليل الحالي للتنفيذ، مثل ما يفعله النوافذ مع DLLs؟ يجب ألا يتضطر الناس إلى تعديل أي متغيرات بيئة (على سبيل المثال DYLD_LIBRARY_PATH)، منذ مرة أخرى أريد هذا للعمل خارج الصندوق.

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

المحلول

كما ذكرت أنك لا تستخدم Xcode، فهذا صعب بعض الشيء. فيما يلي خيارات في طلبي الأفضلية:

  1. التبديل إلى xcode. استخدام الأطر. تتوفر مكتبات SDL كأطر بالفعل، وقد رأيت أكثر من ألعاب تجارية مع LIBSDL.FrameWork داخل حزمة التطبيق.

  2. استخدم الأطر، ولكن الحفاظ على الماكياج الخاصة بك. قم بتنزيل الإصدارات الإطارية من مكتبات SDL الخاصة بك (أو قم ببناءها بنفسك)، وربطها مع علامة رابط غير مرتبط. قم بتوزيع الأطر مع تطبيقك أو لا، وأبلغ المستخدمين وضعهم في إما ~ / مكتبة / أطر أو في / مكتبة / مكتبة. لن أزعج المثبت لهذا.

  3. رابط ثابت ضد SDL. في Makefile، سيتعين عليك سرد مسار المكتبات الثابتة بدلا من استخدام علامة -l، على سبيل المثال، تشغيل "LD BLAH BLAH /OPT/LOCAL/LIB/LIBSDL.A". لا توجد طريقة أعرف أن أخبرها - لا تفضل الثابتة على المكتبات المشتركة، وأصدقوني، لقد بحثت.

نصائح أخرى

النهج الأساسي لهذا هو شحنها في حزمة .APP. ستقوم بعد ذلك بتعديل الموقع يبحث الرابط عن المكتبات المشتركة لتضمين هذا.

الخطوات هي:

  1. قم بإنشاء مرحلة بناء ملفات نسخ جديدة إلى هدفك الذي يقوم بنسخ الملفات في دليل الأطر لحزمة .APP.

  2. قم بتحرير إعداد تكوين Build "مسارات البحث RunPath" لتشمل @executable_path/../Frameworks

إذا قمت ببناء قابلة للتنفيذ مع هذه التغييرات، ثم انظر، يجب أن تجد أن DYLIBS موجودة في Foo.app/Contents/Framework دليل ويدير otool -L Foo.app/Contents/MacOS/Foo يجب أن يكون العائد والدخول مسبقا بواسطة Rath للحصول على هؤلاء Dylibs.

من هذا كوكوابوالدر:

بشكل عام، @loader_path يفضل أكثر من ذلك @executable_path, ، كما هي
يسمح للأطر المضمنة بالعمل في كل من الملفات القابلة للتنفيذ وحزمة،
البرنامج المساعد أو الإطار الفرعي. الجانب السلبي الوحيد هو ذلك @loader_path
يتطلب 10.4 أو أحدث. إذا كنت في 10.5 أو أحدث، @rpath هو حتى
افضل من @loader_path.

ربط ثابت المكتبات.

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