سؤال

أنا بناء بعض المساعدة لسطر الأوامر في كسكودي (C عادي لا الكاكاو).أريد كل منهم إلى استخدام نسخة مخصصة من يببنغ و أريد أن توفير مساحة من خلال تبادل نسخة واحدة في المكتبة بين جميع الملفات التنفيذية (لا مانع من إعادة توزيع .dylib معهم).

هل أنا بحاجة إلى القيام ببعض السحر للحصول على يببنغ تصدير الرموز ؟

لا "الوصلة الثنائية مع المكتبات" بناء المرحلة رابط ثابت?

أبل مستندات ذكر التحميل من المكتبات في وقت التشغيل مع dlopen, ولكن كيف يمكن جعل كسكودي إنشاء قابل للتنفيذ دون أن تشكو مفقود الرموز ؟


أعتقد أنني كنت أحسب ذلك:

  • يببنغ لم يكن ربط بشكل صحيح, لأني بنيت 32/64 بت الملفات التنفيذية و 32 بت المكتبة.بناء إعدادات المكتبة التنفيذية يجب أن تتطابق.

  • يببنغ التكوين.ح يحتاج إلى أطنان من يعرف مثل #define FEATURE_XXX_SUPPORTED

  • "الوصلة الثنائية مع المكتبات" بناء المرحلة مقابض المكتبات الديناميكية على ما يرام ، DYLD_FALLBACK_LIBRARY_PATH متغير البيئة ضروري للتحميل .dylibs من تطبيق حزمة.

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

المحلول

ربما تحتاج إلى التأكد من أن المكتبة الديناميكية التي تقوم بإنشائها تحتوي على ملف رموز مُصدَّر يسرد ما يجب تصديره من المكتبة.إنها مجرد قائمة مسطحة من الرموز، واحدة في كل سطر، للتصدير.

وأيضًا، عندما يتم إنشاء مكتبتك الديناميكية، فإنها تحصل على ملف اسم التثبيت مضمن بداخله وهو، افتراضيًا، المسار الذي تم بناؤه عليه.بعد ذلك، أي شيء يرتبط به سيبحث عنه في المسار المحدد أولاً وبعد ذلك فقط يبحث في مجموعة (صغيرة) من المسارات الافتراضية الموضحة تحت DYLD_FALLBACK_LIBRARY_PATH في ال dyld(1) صفحة الرجل.

إذا كنت ستضع هذه المكتبة بجوار ملفاتك التنفيذية، فيجب عليك ضبط اسم التثبيت الخاص بها للإشارة إلى ذلك.مجرد إجراء بحث على Google عن "اسم التثبيت" من شأنه أن يؤدي إلى ظهور قدر كبير من المعلومات حول القيام بذلك.

نصائح أخرى

ديناميكية الربط على نظام التشغيل Mac OS X صغيرة سبيل المثال

الخطوات:

  1. إنشاء مكتبة libmylib.dylib تحتوي mymod.o
  2. ترجمة و ربط "callmymod" التي يسميها
  3. دعوة mymod من callmymod باستخدام DYLD_LIBRARY_PATH و DYLD_PRINT_LIBRARIES

المشكلة:أنت "فقط" ترغب في إنشاء مكتبة وحدات أخرى للاستخدام.ومع ذلك هناك شاقة كومة من البرامج -- دول مجلس التعاون الخليجي ، ld ، macosx libtool, dyld -- مع عدد مهول من الخيارات بعض السماد فسدت و الاختلافات بين MacOSX و لينكس.هناك طن من صفحات الرجل (أنا أعول 7679 + 1358 + 228 + 226 خطوط في 10.4.11 قدرة شرائية) ولكن ليس الكثير من الأمثلة ، أو برامج مع "قل لي ما تفعله" واسطة.

(أهم شيء في الفهم هو جعل مبسط نظرة عامة على نفسك:رسم بعض الصور, تشغيل بعض الأمثلة ، اشرح لشخص آخر).

الخلفية: أبل OverviewOfDynamicLibraries, ويكيبيديا Dynamic_library


الخطوة 1 إنشاء libmylib.dylib --

mymod.c:
    #include <stdio.h>
    void mymod( int x )
    {
        printf( "mymod: %d\n", x );
    }
gcc -c mymod.c  # -> mymod.o
gcc -dynamiclib -current_version 1.0  mymod.o  -o libmylib.dylib
    # calls libtool with many options -- see man libtool
    # -compatibility_version is used by dyld, see also cmpdylib

file libmylib.dylib  # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib  # versions, refs /usr/lib/libgcc_s.1.dylib

الخطوة 2 وتجميع الرابط callmymod --

callmymod.c:
    extern void mymod( int x );
    int main( int argc, char** argv )
    {
        mymod( 42 );
    }
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
    # == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod  # refs libmylib.dylib
nm -gpv callmymod  # U undef _mymod: just a reference, not mymod itself

الخطوة 3 تشغيل callmymod ربط libmylib.dylib --

export DYLD_PRINT_LIBRARIES=1  # see what dyld does, for ALL programs
./callmymod
    dyld: loaded: libmylib.dylib ...
    mymod: 42

mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp  # dir:dir:...
./callmymod
    dyld: loaded: /tmp/libmylib.dylib ...
    mymod: 42

unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH

أن ينتهي واحدة صغيرة سبيل المثال ؛ نأمل أن يساعد على فهم الخطوات.
(إذا كنت تفعل هذا كثيرا ، انظر غنو Libtool وهو glibtool على أجهزة ماكينتوش ، و SCons.)
هتافات
-- دينيس

لسوء الحظ، من خلال تجربتي، تعتبر وثائق Apple قديمة ومكررة وتفتقد الكثير من المعلومات الشائعة التي قد تحتاجها عادةً.

لقد كتبت مجموعة من الأشياء حول هذا على موقع الويب الخاص بي حيث اضطررت إلى الحصول على FMOD (Sound API) للعمل مع لعبتي عبر الأنظمة الأساسية التي قمنا بتطويرها في uni.إنها عملية غريبة وأنا مندهش من أن Apple لا تضيف المزيد من المعلومات إلى مستندات المطورين الخاصة بها.

لسوء الحظ، على الرغم من كونها "شريرة" مثل Microsoft، إلا أنها في الواقع تقوم بعمل أفضل بكثير في الاعتناء بمطوريها من خلال الوثائق (هذا يأتي من أحد مبشري Apple).

أعتقد بشكل أساسي أن ما لا تفعله هو بعد تجميع حزمة .app الخاصة بك.تحتاج بعد ذلك إلى تشغيل أمر على الملف الثنائي القابل للتنفيذ /MyApp.app/contents/MacOS/MyApp لتغيير مكان بحث الملف القابل للتنفيذ عن ملف المكتبة الخاص به.يجب عليك إنشاء مرحلة إنشاء جديدة يمكنها تشغيل برنامج نصي.لن أشرح هذه العملية مرة أخرى، لقد قمت بذلك بالتفصيل هنا:

http://brockwoolf.com/blog/how-to-use-dynamic-libraries-in-xcode-31-using-fmod

أتمنى أن يساعدك هذا.

هل أنت على علم بالصفحة المرجعية لشركة Apple؟ موضوعات برمجة المكتبة الديناميكية؟يجب أن تغطي معظم ما تحتاجه.انتبه إلى أن هناك مكتبات مشتركة يتم تحميلها دون قيد أو شرط عند بدء تشغيل البرنامج ومكتبات محملة ديناميكيًا (الحزم، IIRC) يتم تحميلها عند الطلب، ويختلف الاثنان بعض الشيء على نظام MacOS X عن نظيرتيهما على Linux أو Solaris.

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