سؤال

أنا أقوم ببناء مكتبة. وكان يتساءل - ما هو الفرق B / W--H و -O CC Componier الخيار (باستخدام Sun Studio C ++)؟

ألا يشيرون إلى نفس الشيء - اسم ملف الإخراج؟

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

المحلول

-o هو اسم الملف الذي سيتم كتابته إلى القرص من قبل المحول البرمجي

-h هو الاسم الذي سيتم تسجيله في الثنائيات ELF التي تصل إلى هذا الملف.

الاستخدام المشترك واحد هو توفير أرقام الإصدار الثانوية للمكتبة. على سبيل المثال، إذا كنت تقوم بإنشاء LibFoo LibFoo المشترك، فقد تفعل:

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1

ثم إذا قمت بتجميع تطبيق Hello World الخاص بك وربطه معه

cc -o hello -lfoo

العفريت الثنائية ل hello سوف يسجل NEEDED الدخول ل libfoo.so.1 (الذي تستطيع أن ترى عن طريق الجري elfdump -d hello ).

ثم عندما تحتاج إلى إضافة وظائف جديدة في وقت لاحق، يمكنك تغيير -o قيمةlibfoo.so.1.1 ولكن اترك الليل libfoo.so.1 - لا تزال جميع البرامج التي بنيت بالفعل مع 1.0 محاولة التحميل libfoo.so.1 في وقت التشغيل، استمر في العمل دون إعادة بنائه، لكن سترى عبر LS أنه 1.1.

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

cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1

(Makefiles الذي تم بناؤه بواسطة مولد MakeFile Makefile القديم من X عادة القيام بذلك.)

نصائح أخرى

إنهم يشيرون إلى أسماء مختلفة. على وجه التحديد، -o الخيار هو الملف فعلي الاسم - واحد على نظام الملفات. ال -h خيار يحدد داخلي DT_SONAME في ملف الكائن النهائي. هذا هو الاسم الذي يشير إليه الكائن المشترك داخليا من خلال وحدات أخرى. أعتقد أنه الاسم الذي تراه أيضا عند تشغيله ldd على الكائنات التي تصل إليها.

سيؤدي خيارنا إلى تسمية ملف الإخراج أثناء تعيين خيار -H اسم جوهري داخل المكتبة. هذا الاسم الجوهري له الأسبقية على اسم الملف عند استخدامه بواسطة Loader الديناميكي ويسمح لها باستخدام قواعد محددة مسبقا لإلقاء نظرة خاطفة على المكتبة المناسبة.

يمكنك معرفة الاسم الجوهري الذي تم تسجيله في مكتبة معينة بهذا الأمر:

elfdump -d xxx.so | grep سونم

إلقاء نظرة هنا للحصول على التفاصيل:

http://docs.oracle.com/cd/e23824_01/html/819-0690/chapter4-97194.html.

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