لماذا تظهر لي أخطاء الارتباط عند استدعاء الدالة في Math.h؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

عند محاولة استدعاء الوظائف 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، راجع هذا الشرح هنا.

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