سؤال

الطريقة التي يتم بها تطوير مشروع فريقي ، ننشئ مكتبة كائنات مشتركة لتطبيقنا من جميع .o ملفات الكائن. مهمتي (نأمل أن تكون محددة بما فيه الكفاية ولكن عامة بما يكفي للاستخدام للآخرين!) هي الارتباط في ملفات الكائن فقط التي تغيرت منذ آخر مرة تم إنشاء التنفيذ. على سبيل المثال ، إليك سطر الأوامر الذي أستخدمه لإنشاء .So:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o   -o libMySharedLibrary.so

الذي يعمل كما هو متوقع! :) هدفي هو أن أكون قادرًا على الارتباط في ملفات الكائن التي تم تغييرها فقط من الآن فصاعدًا ، لتسريع عملية الربط المتزامنة. سيكون أمر مثال:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o   -o libMySharedLibrary.so

التي من شأنها تحديث libMySharedLibrary.so مع ملفات الكائنات الأحدث ، مع الحفاظ على ملفات الكائن الأقدم في libMySharedLibrary.so ايضا. في الواقع ، عندما أولد libMySharedLibrary.so باستخدام الأمر أعلاه ، يكون حجم الملف أصغر بكثير من حجم جميع ملفات الكائنات ، لذلك يمكنني أن أتأكد تقريبًا من أن الأمر أعلاه لا يفعل ما أريد.

من خلال بحثي ، وجدت أن هناك -i خيار الرابط الذي هو نفسه -r الخيار ، الذي يبدو أنه يجمع فقط بين جميع ملفات الكائن في ملف كائن كبير واحد أيضًا. لسوء الحظ ، لا يبدو أن هذا ما أريده.

باختصار ، أود ربط ملفات الكائن التي تم تغييرها فقط بعد الرابط الأولي ، مما أدى إلى ارتباط أسرع للروابط المستقبلية. هل هناك طريقة للقيام بذلك؟

تحرير: مثال على ما جربته -i/-r:

أمثلة الأمر: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

اضطررت لإضافة ملف -nostdlib علامة لإيقافها من الصراخ في وجهي حول الحاجة إليها ، وإزالتها -shared لأن الكائنات المشتركة غير مسموح بها مع -r بطاقة شعار.

يبدو أن هذا الأمر ينفد جميع ملفات .o في ملف .o واحد كبير. لذلك إذا كان بإمكاني تحديث ملف .o من هنا فصاعدًا مع ملفات .O التي تم تغييرها فقط ، فسيكون ذلك رائعًا. بعد أن تم إنشاء allmyobjects.o في البداية ، جربت هذا الأمر: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o, ، لكنه سيخلق أيضًا أصغر بكثير (بحجم الملف) AllMyObjects.o, ، لذلك أفترض أنه لا يمكن أن يكون لديك جميع ملفات الكائنات. أشعر أن هذا شيء من المحتمل أن أرتكب خطأً بسيطًا. أي شخص لديه أي نصيحة؟ شكرا لك مقدما.

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

المحلول

يبدو أنك محق في -shared و -r لا تعمل معًا. كنت متشككًا في إصدار GCC القديم الخاص بك ، ولكن حتى في Ubuntu 10.10 أستطيع أن أرى نفس الشيء:

$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together

لسوء الحظ ، هذا يعني أنك وصلت إلى طريق مسدود إذا كنت بحاجة إلى كائنات مشتركة تمامًا. رابط BinuTils ببساطة لا ينفذها.

إذا كانت المكتبات الثابتة خيارًا لك ، فهي ببساطة أرشيفات يمكن معالجتها بسهولة مع ar جدوى.

خلاف ذلك ، سيكون عليك النظر في روابط مختلفة أو أجنحة البرمجيات. لا أستطيع أن أضمن أنك ستجد هذه الميزة ، على الرغم من أنها تبدو غريبة.

نصائح أخرى

يمكنك الحصول على سلوك أنت بعد استخدام المكتبات الأرشيف/الثابتة ، ولكن الرابط الأولي سيظل نفس الوقت من الوقت.

باستخدام ملف أرشيف:

# Initially create the archive
ar r libmylib.a <all object files>

# Create your shared object (re-use this line after libmylib.a is updated)
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so     

# Update the archive file
ar r libmylib.a updated1.o updated2.o

كما قلت ، سيستغرق الأمر نفس القدر من الوقت لربط .so كما فعلت من قبل.

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