لماذا تظهر لي أخطاء الارتباط عند استدعاء الدالة في Math.h؟
سؤال
عند محاولة استدعاء الوظائف math.h
, ، أتلقى أخطاء في الارتباط مثل ما يلي
undefined reference to sqrt
لكنني أفعل #include <math.h>
أنا أستخدم gcc وأقوم بالتجميع على النحو التالي:
gcc -Wall -D_GNU_SOURCE blah.c -o blah
لماذا لا يستطيع الرابط العثور على تعريف لـ sqrt
?
المحلول
أضف -lm إلى الأمر عند الاتصال بـ gcc:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
سيخبر هذا الرابط بالارتباط بمكتبة الرياضيات.سيؤدي تضمين math.h إلى إخبار المترجم بوجود وظائف رياضية مثل sqrt()، ولكن تم تعريفها في مكتبة منفصلة، والتي يحتاج الرابط إلى حزمها مع الملف القابل للتنفيذ.
كما أشار FreeMemory إلى أن المكتبة تسمى libm.a .في الأنظمة المشابهة لنظام Unix، قاعدة تسمية المكتبات هي lib[blah].a .ثم إذا كنت تريد ربطها بالملف القابل للتنفيذ، فاستخدم -l[blah] .
نصائح أخرى
تحتاج إلى ربط مكتبة الرياضيات بشكل صريح.يضيف -lm
إلى العلامات التي تقوم بتمريرها إلى gcc حتى يعرف الرابط كيفية الارتباط libm.a
ألحق -lm
إلى نهاية الأمر gcc لربط مكتبة الرياضيات:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
لكي يتم ربط الأشياء بشكل صحيح، فإن ترتيب أعلام المترجم مهم!على وجه التحديد، -lm
يجب أن توضع في نهاية السطر.
إذا كنت تتساءل لماذا math.h
يجب تضمين المكتبة على الإطلاق عند التجميع في لغة C، راجع هذا الشرح هنا.