انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: تفاوت مفهومی استفاده از سوئیچ c - در کامپایل کردن چیست ؟  (دفعات بازدید: 2281 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین bt.eiliya

  • Newbie
  • *
  • ارسال: 11
سلام
یه سوالی داشتم
توی کامپایل کردن یه برنامه با ++g توی لینوکس یه سوئیچ c- وجود داره که اگر بزاریم به معنی هست که کامپایل میشه بدون لینک شدن وابستگی ها!
خوب فرض کنید من یه فایل به اسم main.cpp را میخوام کامپایل کنم که به دوتا lib وابسته هست به اسم های lib1.h , lib2.h میخواستم ببینم وقتی به صورت عادی عمل کلمپایل را انجام میدم با وقتی که از سوئیچ c- استفاده میکنم تفاوت چیه ؟
یه مقاله هم خوندم که نوشته بود عمل لینک توی آخرین مرحله کامپایل اتفاق میافته .


کسی میتونه به صورت مفهومی تفاوت کامپایل با استفاده از سوئیچ c- و بدون استفاده از سوئیچ c- را توضیح بده که چه اتفاقی میافته؟
پیشاپیش ممنون.

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
تفاوت اول: اگر برنامه شما به فایل های lib1.h و lib2.h نیاز داشته باشد حتما به فایل های lib1.cpp و lib2.cpp که پیاده سازی کتابخانه ها هستند نیز نیاز دارد.در این هنگام برنامه main.cpp شما موقع کامپایل شدن باید به آن دو فایل لینک شود.بنابراین اگر شما از دستوری مانند
g++ main.cppاستفاده کنید برنامه با موفقیت کامپایل نمی شود.دو راه موجود است راه اول:
g++ main.cpp lib1.cpp lib2.cppاین روش هر سه برنامه را کامپایل و به هم لینک می کند.روش دوم:
g++ -c main.cpp
g++ main.o lib1.o lib2.o
این روش ابتدا برنامه را به تنهایی کامپایل می کند و سپس به دو کتابخانه که قبلا کامپایل شده اند لینک می کند.

در برنامه های کاربردی چون تعداد فایل های برنامه زیاد است ابتدا هر فایل جدا کامپایل می شود و سپس فایل ها به هم لینک می شوند.فایده دیگر این عمل این است که در صورت تغییر فقط در یکی از فایل ها نیاز به کامپایل کردن برنامه از ابتدا نیست و فقط همان یک فایل مجددا کامپایل می شود و سپس به فایل های دیگر که کامپایل شده اند لینک میشود.

فرق دوم: سوییج -c فایل ای می سازد که قابل اجرا شدن نیست.(چون آدرس های درون آن نسبی هستند یعنی آدرس دهی درون آن از خانه صفر رم شروع می شود.در هنگام لینک کردن طبق کتابخانه ای که قرار است برنامه را احرا کند آدرس های نسبی به آدرس های واقعی تر تبدیل می شوند.البته بار هم آدرس ها نسبی اند ولی این دفعه برای مثال از خانه ۴۰۰۰ آغاز می شوند.همچنین لیبل هایی مانند نام تابع ها و نام کلاس ها در فایل های .o وجود دارند برای این که هنگام متصل شدن به برنامه های دیگر معلوم باشد هر تابع و هر کلاس کجاست.این لیبل ها در هنگام لینک شدن از بین می روند و همه چیز به شماره (آدرس) تبدیل می شود.) و در هنگام لینک کردن کلی عملیات انجام می شود تا برنامه قابل اجرا شود.بنابراین حتی اگر برنامه شامل فقط یک فایل باشد هم در مرحله object یعنی فایل .o قابل اجرا نیست و باید پس از طی مرحله لینک به فایل اجرایی تبدیل شود.
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آنلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4872
  • جنسیت : پسر
  • masoft قدیم
تنها تفاوت اینه که وقتی c- استفاده می‌کنید، اون قسمت Linking انجام نمی‌شه.

آفلاین alieblice

  • High Hero Member
  • *
  • ارسال: 1275

آفلاین bt.eiliya

  • Newbie
  • *
  • ارسال: 11
خیلی ممنون از راهنمایی های کاملتون.
راستی چرا انجمن دکمه تشکر نداره ؟!!!! یا من نمیبینم؟

آفلاین alieblice

  • High Hero Member
  • *
  • ارسال: 1275
جاش گذینه مثبت منفی داره که برایه کاربرایه بالایه فکر کنم 100 پست فعال میشه.