سؤال

أواجه مشكلة مع برنامج التحويل البرمجي تقول لي هناك 'undefined إشارة إلى وظيفة كنت ترغب في استخدام في المكتبة.اسمحوا لي أن أشاطركم بعض المعلومات عن المشكلة:

  • أنا عبر تجميع مع دول مجلس التعاون الخليجي من أجل C.
  • أنا استدعاء وظيفة المكتبة التي يتم الوصول إليها من خلال إدراج رأس والذي يتضمن آخر الرأس الذي يحتوي على النموذج.
  • ولقد تضمنت رؤوس دليل استخدام -أنا و أنا متأكد أنه يتم العثور عليها.
  • أنا خلق أولا .o ملفات ثم ربطها في قيادة منفصلة.

لذلك أفكر أنه قد يكون النظام والتي تشمل مكتبة الملفات, ولكن لست متأكدا ما هي الطريقة الصحيحة أن تأمر بها.حاولت مع بما في ذلك رؤوس مجلد سواء قبل أو بعد .o ملف.

بعض يوحي ستكون كبيرة وربما وشرح كيف الرابط لا شيء فيها.

وذلك بفضل!


استجابة إجابات

  • لا يوجد .مكتبة الملفات فقط .ساعة .ج في المكتبة ، لذلك أنا غير مناسب
  • أفهم من مكتبة الملف هو مجرد مجموعة من رأس الملفات المصدر ، ولكن ربما انها مجموعة من .س الملفات التي تم إنشاؤها من المصدر؟!
  • لا يوجد مكتبة ملف الكائن الذي يتم إنشاؤه ، ربما يجب أن يكون هناك??نعم يبدو أنني لا أفهم الفرق بين تشمل والمكتبات...سأعمل على أن :-)

شكرا على كل الردود!تعلمت الكثير عن المكتبات.أود أن أضع كل الردود المقبولة الجواب :-)

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

المحلول

يبدو أنك لا جمع .ج الملف في المكتبة لإنتاج .o ملف.رابط سيبحث النموذج التنفيذ في .o ملف تنتجها تجميع المكتبة

لا بناء عملية تجميع المكتبة .ج الملف ؟

لماذا نسميها "مكتبة" لو كان في الواقع مجرد شفرة المصدر ؟

نصائح أخرى

رؤوس توفر وظيفة الإعلانات تعريفات الدالة.للسماح رابط العثور على وظيفة تنفيذ (و التخلص من إشارة غير محددة) التي تحتاج إلى أن تسأل مترجم سائق (مجلس التعاون الخليجي) إلى رابط المكتبة حيث وظيفة يقيم باستخدام-l العلم.على سبيل المثال أنا سوف رابط مكتبة الرياضيات.وظيفة دليل الصفحة عادة ما تحدد ماذا المكتبة إن وجدت يجب أن تكون محددة للعثور على وظيفة.

إذا كان الرابط لا يمكن العثور على محدد المكتبة يمكنك إضافة مكتبة مسار البحث باستخدام-L مفتاح (على سبيل المثال ، - L/usr/local/lib).يمكنك أيضا تؤثر بشكل دائم على المكتبة المسار من خلال LIBRARY_PATH متغير البيئة.

وهنا بعض التفاصيل الإضافية لمساعدتك على تصحيح المشكلة.حسب الاتفاقية أسماء ملفات مكتبة مسبوقة بـ lib و (في شكل ثابت) لها .تمديد.وهكذا مرتبطة بشكل ثابت نسخة من النظام الافتراضي الرياضيات مكتبة (واحد الارتباط مع -lm) عادة في /usr/lib/libm.أ.لمعرفة ما حرف معين مكتبة يعرف يمكنك تشغيل نيوتن متر --معرف فقط على ملف مكتبة.على نظام تشغيل الأمر على libm.أحد يعطيني الناتج كما يلي.

e_atan2.o:
00000000 T atan2

e_asinf.o:
00000000 T asinf

e_asin.o:
00000000 T asin

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

GNU assembler version 2.15 [FreeBSD] 2004-05-23 (i386-obrien-freebsd) 
using BFD version 2.15 [FreeBSD] 2004-05-23
/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o 
/usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib /var/tmp//ccIxJczl.o -lgcc -lc 
-lgcc /usr/lib/crtend.o /usr/lib/crtn.o

أخشى أنك مختلطة المكتبة رأس المفاهيم.دعونا نقول لديك مكتبة libmylib.a الذي يحتوي على وظيفة myfunc() و المقابلة رأس mylib.h يحدد النموذج الأولي.في الملف المصدر myapp.c تضمين رأس ، إما مباشرة أو بما في ذلك آخر رأس يشمل ذلك.على سبيل المثال:

/* myapp.h
** Here I will include and define my stuff
*/
...
#include "mylib.h"
...

ملف المصدر الخاص بك تبدو مثل:

/* myapp.c
** Here is my real code
*/
...
#include "myapp.h"
...
/* Here I can use the function */
myfunc(3,"XYZ");

الآن يمكنك ترجمة ذلك إلى الحصول على myapp.o:

gcc -c -I../mylib/includes myapp.c

علما أن أنا فقط يقول دول مجلس التعاون الخليجي حيث رؤوس الملفات ، لديهم شيء للقيام مع المكتبة نفسها!

الآن يمكنك ربط التطبيق الخاص بك مع المكتبة:

gcc -o myapp -L../mylib/libs myapp.o -lmylib

علما بأن -L التبديل يقول دول مجلس التعاون الخليجي حيث المكتبة ، -l يقول أن الرابط الخاص بك رمز إلى المكتبة.

إذا كنت لا تفعل هذه الخطوة الأخيرة قد تواجه المشكلة الموضحة.

قد يكون هناك غيرها من الحالات الأكثر تعقيدا لكن من سؤالك ، آمل أن يكون هذا سوف يكون كافيا لحل المشكلة.

ما makefile, و وظيفة المكتبة الذي تحاول الاتصال به.بسيطة حتى دول مجلس التعاون الخليجي makefiles وعادة ما يكون مثل هذا الخط:

LIBFLAGS =-lc -lpthread -lrt -lstdc++ -lShared -L../shared

في هذه الحالة تعني ربط المكتبة القياسية C وغيرها

أعتقد أن لديك لإضافة المسار حيث رابط يمكن العثور على libraray.في دول مجلس التعاون الخليجي/ld يمكنك أن تفعل هذا مع -L libraray مع -l.

-Ldir, --مكتبة-path=dir

بحث في دليل dir قبل القياسية البحث عن الدلائل (هذا الخيار يجب أن تسبق الخيار-l الذي يبحث هذا الدليل).

-الصنوبر ، --مكتبة=أرشيف

تشمل ملف الأرشيف القوس في قائمة ملفات الارتباط.


استجابة إجابات - لا يوجد .مكتبة الملفات فقط .ساعة .ج في المكتبة لذا انا ليس الصحيح بشريط

ثم قد تضطر إلى إنشاء libraray أولا ؟

gcc -c mylib.c -o mylib.o
ar  rcs libmylib.a      mylib.o

لقد واجهت هذه المشكلة عند بناء البرنامج مع نسخة جديدة من دول مجلس التعاون الخليجي.تم إصلاح المشكلة عن طريق استدعاء دول مجلس التعاون الخليجي -std=gnu89 الخيار.ويبدو أن هذا كان بسبب مضمنة وظيفة الإعلانات.لقد وجدت هذا الحل في https://gcc.gnu.org/gcc-5/porting_to.html

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