انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: bt.eiliya در 13 آبان 1391، 11:41 بظ
-
سلام
یه سوالی داشتم
توی کامپایل کردن یه برنامه با ++g توی لینوکس یه سوئیچ c- وجود داره که اگر بزاریم به معنی هست که کامپایل میشه بدون لینک شدن وابستگی ها!
خوب فرض کنید من یه فایل به اسم main.cpp را میخوام کامپایل کنم که به دوتا lib وابسته هست به اسم های lib1.h , lib2.h میخواستم ببینم وقتی به صورت عادی عمل کلمپایل را انجام میدم با وقتی که از سوئیچ c- استفاده میکنم تفاوت چیه ؟
یه مقاله هم خوندم که نوشته بود عمل لینک توی آخرین مرحله کامپایل اتفاق میافته .
(http://www3.ntu.edu.sg/home/ehchua/programming/cpp/images/GCC_CompilationProcess.png)
کسی میتونه به صورت مفهومی تفاوت کامپایل با استفاده از سوئیچ c- و بدون استفاده از سوئیچ c- را توضیح بده که چه اتفاقی میافته؟
پیشاپیش ممنون.
-
تفاوت اول: اگر برنامه شما به فایل های 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 قابل اجرا نیست و باید پس از طی مرحله لینک به فایل اجرایی تبدیل شود.
-
تنها تفاوت اینه که وقتی c- استفاده میکنید، اون قسمت Linking انجام نمیشه.
-
اینم شاید مفید واقع بشه :
http://www.thegeekstuff.com/2011/10/gcc-linking/
-
خیلی ممنون از راهنمایی های کاملتون.
راستی چرا انجمن دکمه تشکر نداره ؟!!!! یا من نمیبینم؟
-
جاش گذینه مثبت منفی داره که برایه کاربرایه بالایه فکر کنم 100 پست فعال میشه.