سؤال

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

#include <math.h>
#include <stdio.h>

int main()
{
    double a = 2.0;
    double b = sqrt(a);
    printf("%f", b);
    return 0;
}

عندما أقوم بتشغيل هذا البرنامج ، أحصل على الخطأ التالي:

gcc -Wall -o "test2" "test2.c" (in directory: /home/eddy/Code/euler)
/tmp/ccVfxkNh.o: In function `main':
test2.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Compilation failed.

ومع ذلك ، إذا استبدلت الوسيطة في SQRT () ثابت مثل 2.0 على سبيل المثال ، (b = sqrt(2.0)) ، ثم يعمل بشكل جيد. هل من المفترض أن تعمل SQRT () مع المتغيرات أو شيء من هذا القبيل؟

شكرا للمساعدة

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

المحلول

تحتاج إلى الارتباط بمكتبة الرياضيات (استخدم "-lm" على سطر الأوامر). في الحالة الثابتة ، من المحتمل أن يكون المترجم ذكيًا ومسبقًا لـ SQRT (2.0) (وبالتالي فإن الكود الذي تم تجميعه هو أساسًا "B = 1.414 ... ؛ ')

نصائح أخرى

ربما تحتاج إلى إضافة -lm عند التجميع. عندما تأخذ الجذر التربيعي للثابت ، يقوم المترجم بتحسين الكود عن طريق أخذ الجذر التربيعي أثناء تجميعه ، لذلك لا يستخدم sqrt على الاطلاق.

استخدم الأمر gcc -Wall -o "test2" "test2.c" -lm والتي من المحتمل أن تصلح هذا.

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

في حالة GCC ، تحتاج إلى ربط المكتبة.

GCC Filename.c -lm.

ومع ذلك ، في حالة G ++ لا حاجة لربط المكتبة بحيث يعمل هذا بشكل جيد:

g ++ filename.c -o fileName بمجرد نجاح التجميع.

لتشغيل ببساطة إدخال ./filename في G ++. وأدخل ./A.out في مجلس التعاون الخليجي.

جمع مع:

gcc -Wall -o test2 test2.c -lm

تحتاج إلى الارتباط مع مكتبة الرياضيات.

قم بتضمين مكتبة الرياضيات باستخدام "مشغل"

#include " math.h "

برنامج التجميع باستخدام -lm خيار لترفيه مكتبة الرياضيات لنفترض اسم برنامجنا test.c نحن نتجمع على النحو التالي

gcc test.c -lm

لا تربط GCC المكتبات القياسية بشكل افتراضي. لذلك تحتاج فقط إلى القيام بذلك في حالة التجميع عبر GCC:

GCC Filename.c -lm .

ومع ذلك ، في حالة G ++ لا حاجة لربط المكتبة بحيث يعمل هذا بشكل جيد:

G ++ Filename.c -o اسم الملف

هذا يفي بالغرض بالنسبة لي. أعتقد أن هناك بعض المشكلات في مكتبة الرياضيات الخاصة بك. حاول ربطه مرة أخرى وانظر. رمز حكيم آخر مثالي تمامًا.

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