PDA

View Full Version : مبتدی: یه سوال در مورد تفاوت عملکرد لینکر gcc با ++g



ahmad24shargh
دوشنبه 27 آبان 1392, 19:15 عصر
با سلام به همه اساتید محترم

تو یه فایل به اسم main.c کد زیر رو دارم :


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

int main(int argc, char **argv) {
double da = 0.1;
printf("%f\n", round(da) );
return 0;
}


اونو با دستور زیر کامپایل کردم :


gcc -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu11 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "./main.c"


حالا اگر اونو با خود gcc لینک کنم ارور میده :


$ gcc -o "sample" ./main.o
./main.o: In function `main':
/home/ahmad/workspace/sample/./main.c:6: undefined reference to `round'
collect2: error: ld returned 1 exit status


اما با ++g همین فایل سورس بدون ارور لینک میشه :


$ g++ -o "sample" ./main.o


اگر به جای متغیر da یه عدد اعشاری ثابت به تابع round ارسال کنم بدون مشکل فایل اجرایی لینک میشه.اما با وجود متغیر به جای یه ثابت این ارور رو میده.با حذف همه آپشنهای کامپایل هم وضعیت تغییری نمیکنه.چرا؟(gcc version 4.8.2)

pswin.pooya
چهارشنبه 29 آبان 1392, 11:10 صبح
خب یا سورس برنامه و یا اینکه هدرهایی مه استفاده کردید برای c++ هست و نه c

نمونه اون میتونه هدر cmath باشه که داخل c++ به صورت زیر:


#include <cmath>

و داخل c


#include <math.h>

ahmad24shargh
چهارشنبه 29 آبان 1392, 16:01 عصر
اگر میشه یه بار دیگه پست منو بخونید.من اونو با eclipse-cdt تست کردم.یعنی میدونم هدر math.h (و ماکروی مربوطه) در دسترس gcc هست.اگر دقت کنید گفتم با ارسال عدد ثابت به جای متغیر کار میکنه.کد هم یه کد ساده C هست و ربطی به ++c نداره.چرا GCC C LINKER نمیتونه عمل لینک رو انجام بده؟ اما GCC C++ LINKER مشکلی نداره ؟
تابع round یه مقدار ثابت double میگیره و double برمیگردونه.با عدد ثابت مشکلی نیست اما با ارسال یه متغیر لینک نمیشه.همونطور که شما بهتر از من میدونید تو سینتکس این سورس کد ساده مقدار متغیر da به تابع round فرستاده میشه نه خود متغیر.یعنی به لحاظ تئوری یا باید هر دو حالت لینک نشن یا هردو حالت لینک بشن.چون یکسان هستند(از دید کامپایلر)

pswin.pooya
پنج شنبه 30 آبان 1392, 00:20 صبح
سلام
شرمنده خطا شبیه خطاهای اینچنینی بود. از فرمان زیر برای کامپایل استفاده کنید:


gcc test.c -lm

با اینکار به لینکر (سوئیچ l) می گید که کتابخونه math ( m) رو لینک کنه. خطا مربوط به لینکر ld هست و نه کامپایلر

فکر کنم این شکلی مشکل حل شه. اما اگر نشد احتمالا تابع round ویرایش gcc از نوع double پشتیبانی نمی کنه