PDA

View Full Version : سوال: سوال در مورد فايلهاي با پسوند obj



حسین محمدی
پنج شنبه 06 تیر 1387, 12:53 عصر
با سلام

1. فايلهاي با پسوند obj چه فايلهايي هستند؟

من در پروژه اول خود ابتدا يك dll ساخته ام و lib و dll آن را در پروژه دوم خود اضافه كرده ام.
در ساختن اين dll يك سري تعاريف و ماكروها در هدر فايلهاي سازنده آن به علاوه و يك فايل obj. استفاده كرده ام كه انتظار داشتم با اضافه كردن آن فايلها به پروژه دوم خود تمام آن تعاريف در برنامه شناخته شوند كه شناخته نشد مثلا يك structure در dll تعريف كرده بودم ولي در پروژه دوم خود آن structure را نمي ديد و از آن error مي گرفت.
و مجبور شدم تمام هدر فايلها را به برنامه اضافه كنم تا تمام تعارف در برنامه تكرار شود.
در يك مورد نيز چند فايل lib را اضافه كردم و يك جا نيز با اضافه كردن يك فايل با پسوند obj به linker پروژه مشكل حل شد و اين مورد آخر را با سعي و خطا انجام دادم.
سوال من اين است كه اين فايلهاي با پسوند obj داراي چه كدهايي هستند. آيا درست است كه من آنها را در linker برنامه قرار دهم؟
اين فايلهاي obj با كامپايل پروژه هاي exe نيز به وجود مي آيند. آيا مي توان آنها را نيز در پروژه هاي ديگر اضافه كرد؟
يا اضافه كردن انها در پروژه هاي ديگر چه تاثيري دارد؟

من در جايي ديگر از پروژه ام تا زمانيكه يك فايل با پسوند obj را اضافه نكرده بودم از من يك lib فايل مي خواست كه با اضافه كردن آن ديگر آن فايل lib را از من نخواست.

اگر ممكن است توضيحي نيز در مورد فايلهاي lib بدهيد كه شامل چه چيزي است و اينكه اگر من يك lib را به پروژه اضافه كنم آيا نياز است كه dll آنرا به پروژه اضافه كنم؟

Nima_NF
سه شنبه 11 تیر 1387, 16:35 عصر
obj یا همان object file خروجی های کامپایل شده واسطی هستند (intermediate outputs) که توسط کامپایلر تولید شده و در صورت نیاز بهینه سازی توسط کامپایلر VC روی آن ها انجام می شود، هدف این فایل ها این است که در پروژه های بزرگ به جای اینکه کل پروژه را هر دفعه با زدن کلید build کامپایل کنید (که زمان زیادی احتیاج دارد)، فقط فایل های تغییر کرده را دوباره کامپایل کنید و سپس کامپایلر این فایل های obj را به هم لینک می کند و پس از بهینه سازی نهایی فایل اجرایی را می سازد.

پس توجه کنید که فایل های obj با کوچکترین تغییری در کدها نیاز به ساخت مجدد دارند، لذا نمی توانم دقیق بگویم چه محتویاتی دارند و اینکه در این مرحله از کامپایل (به فایل های کامپایل شده و واسط obj ) آیا هنوز به lib احتیاج دارند یا خیر... اما با استفاده از برنامه هایی مثل Dumpbin.exe می توان فهمید داخل obj. ، فایل های lib و dll لیست شده اند و به آن ها نیاز دارد.

فايلهاي lib که مد نظر شماست import libraries هستند یا همان فایل هایی که همراه dll هستند و فقط شامل اطلاعات توابع مانند آدرس و پارامتر ها و غیره هست (شامل خود تابع نیست) و فقط در هنگام کامپایل موردنیاز هستند تا آدرس توابع مشخص و پیدا شود.

ضمنا فایل های lib دیگری هم وجود دارد که نیاز به dll ندارند (static library)

موفق باشید