كيفية الجمع بين عدة C/C++ المكتبات في واحد ؟

StackOverflow https://stackoverflow.com/questions/13128

  •  08-06-2019
  •  | 
  •  

سؤال

أنا تعبت من إضافة عشرة مكتبات الارتباط في المشروع ، أو التي تتطلب ثمانية منهم إلى استخدام بلدي.أود أن أغتنم المكتبات الموجودة مثل يببنغ.أ ، libz.أ ، libjpeg.a, والجمع بينهما في واحد .مكتبة.هل هذا ممكن ؟ ماذا عن الجمع .ليب المكتبات ؟

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

المحلول

على يونكس مثل أنظمة ld و ع المرافق يمكن أن تفعل هذا.تحقق من http://en.wikipedia.org/wiki/Ar_(Unix) أو البحث في صفحات الرجل على أي مربع لينكس أو من خلال جوجل, e.g 'unix رجل ar'.

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

نصائح أخرى

يمكنك استخراج ملفات الكائن من كل مكتبة

ar x <library name>

ثم دمج كل منهم إلى مكتبة جديدة مع

ar cs <new library name> <list each extracted object file>

على لينكس أو مينغو أو Cygwin, مع جنو toolchain:

ar -M <<EOM
    CREATE libab.a
    ADDLIB liba.a
    ADDLIB libb.a
    SAVE
    END
EOM
ranlib libab.a

أو إذا كنت يمكن أن تبقي على وجود liba.a و libb.a:

ar crsT libab.a liba.a libb.a

على النوافذ مع MSVC toolchain:

lib.exe /OUT:libab.lib liba.lib libb.lib

ربما أنا سوء الفهم, لكن لا عليك فقط أن السفينة يبس إذا كان المستخدم النهائي رمز المكالمات لهم مباشرة ؟ إذا كان كل الوصول إلى Jpeg الطرق وغيرها من التعليمات البرمجية الخاصة بك في مكتبة ثابتة, ثم ربط يبس في ليب.

أولا-هاء.

----------------
| End-user exe |
----------------
      |
      | makes calls to
      |
      v
 --------------------
 | Your static lib.a | 
 --------------------
         | makes calls to and links
         v
     ------------------------------------ .....
     |                    |         |
  -------------    -------- ---------- 
  | libjpeg.a |    |libz.a| |libpng.a|
  -------------    -------- ----------

أي انها فقط مسألة إذا التعليمات البرمجية في نهاية يحتاج إلى إجراء المكالمات مباشرة إلى libz.أ ، يببنغ.إلخ.

إذا كان التطبيق رمز الشرعية تحتاج إلى استدعاء libz.، على سبيل المثال ، ثم كان كما ذكر أعلاه يكون حالة استخدام الديناميكي وحدة.

PS:هل يمكنني الحصول على الفنانين الشارة ؟ :)

أنا غير متأكد من كيفية جسديا الجمع بينهما في ملف واحد ، ومع ذلك يمكن أن توظف فكرة مجردة من نوع و تشمل فقط واحد "AllMyLibs.أ/ساعة" والذي بدوره يشمل كل ما تريد.يمكنك أيضا وضع هذا في الموقع حيث مترجم يبحث عن المكتبات ، لذلك سيكون العمل في أي مشروع.

P. S.- من باب الفضول لماذا يكرهون بما في ذلك واحدة يبس?

الجمع بين العديد من طرف ثالث المكتبات في واحدة يمكن أن تخلق المزيد من المشاكل بالنسبة لك-على سبيل المثال ، إذا كان اثنان من هذه المكتبات تحديد رمز المشترك والتي البرنامج لا يستخدم.الآن كنت قد حصلت على استخراج جميع (أو جميع ولكن واحدة) من الحالات الشائعة رمز قبل أن الجمع بين المكتبات.

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