كيف يمكنني معرفة أي مكتبة هي موطن لكائن معين؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

وأنا البرمجة في FORTRAN و C على SGI تشغيل ايركس 6.5، ولكن ينبغي أن يكون هذا ينطبق على جميع أنظمة يونكس مثل. كيف يمكنني العثور على أي مكتبة أحتاج لربط برنامجي عندما أحصل على "حل النص رمز" الخطأ الارتباط؟ وهنا مثال على ما اراه من رابط:

ld32: ERROR  33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a

هل يجب فقط أن تعرف ما هي المكتبات المطلوبة، أو أن هناك بعض الأدوات أو الأوامر التي يمكن أن تساعدني في هذا الرقم؟

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

المحلول

يمكنك استخدام الأمر nm لإدراج رموز ديناميكية من مكتبة المشتركة:

nm -D /lib/libc.so.6

وثم grep عن الرمز الذي تبحث عنه. حذف -D للمكتبات ثابتة. يمكنك استخدام هذا في حلقة أو مع xargs لمسح مكتبات متعددة.

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

نصائح أخرى

وعن طريق nm (كما في <لأ href = "https://stackoverflow.com/questions/290799/how-can-i-find-out-which-library-is-home-to-a-given-object # 290815 "> روبرت غامبل الجواب ) هو الإجابة الصحيحة على سؤالك. الحيلة هي في معرفة مكان للبحث عن المكتبات. ماذا يفعل البرنامج؟ إذا كان هناك كمية كبيرة من numerics مستمرة، وهناك احتمالات يجب أن تكون على ربط ضد مكتبات الرياضيات (مثل LAPACK أو بلاس)، وربما تريد أن تبدأ في النظر هناك. البحث على شبكة الإنترنت يمكن أن تكون مفيدة أيضا - أنا كتبته "ortho2" في محرك البحث المفضل لبلدي وحصلت على هذه الوثائق توحي انها في libfgl.a

لاحظ أنه عند البحث ربما يجب عليك حذف السطر زائدة - فإنه عادة ما تضاف الى اسم روتيني من قبل المجمع

.

وأنا قاوم إغراء لإضافة هذا الجواب روبرت غامبل - النظر في هذا تكملة لذلك

واحذر من مجرد افتراض أن "أي مباراة" على ما يرام للاستخدام. كانت هناك حالة في آخر السؤال SO حيث تم نقل مجموعة من التعليمات البرمجية من ويندوز ليونكس ورمز ويندوز تستخدم getch() لقراءة حرف واحد من المدخلات. ذهب للمستخدم من خلال عملية مماثلة لهذا وجدت getch() على يونيكس في المكتبة curses. لذلك، يمكن للمستخدم ربط مع مكتبة curses وتساءل لماذا ألقى الأساسية التعليمات البرمجية. المشكلة هي، وgetch() المستخدمة فعليا يفترض أن التهيئة المناسبة تم القيام به، وأنه لم يتم التهيئة المناسبة. في الواقع، وربما لم يكن روتين ما هو مطلوب.

في سولاريس، وهناك خيارات لnm أن أقول لك اسم المكتبة وجوه ملف داخل المكتبة التي تحتوي على الرمز (و-r هذه لاسم المكتبة، و-R لكائن داخل المكتبة) حتى.

وحذار أسماء المهترئ C ++، أيضا. على سبيل المثال ortho2 هو واضح ليس C ++ المهترئ.

إذا انها وظيفة القياسية، والتي يمكن أن يكون ortho2، فإن الصفحة رجل اقول لكم الذي مكتبة أنها في.

ولدي النصي lookfor قليلا. أدخل FUNC_NAME lookfor

#!/bin/csh
foreach i (*.o *.a *.so)
 echo $i
 nm $i | grep -i $1
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top