ورود

View Full Version : معرفی میسر کتابخانه ها به کامپایلر و linker



bizmit
شنبه 19 بهمن 1387, 20:53 عصر
با سلام
یک سوال کلی در مورد کتابخانه ها داشتم (دلیل اینکه در این تاپیک مطرح کردم این بود که اشاره ای به کتابخانه cryptopp داشتم، اگر صلاح دانستید، محل این پست را تغییر دهید!)

به طور کل برای استفاده از توابع یک کتابخانه(به فرض library ) در یک پروژه VC++ ، آیا این مراحل کافی است؟
1- اضافه کردن دستور

#include”library.h”
در بالای کد.
2- کپی کردن فایل های library.h و library.lib درون فولدر مربوط به پروژه.

چون من خودم در پروژه ای برای استفاده از کتابخانه Winscard.h ، فقط دو مرحله بالا را انجام دادم و پروژه به درستی کامپایل و اجرا شد!

1- پس include کردن فولدر حاوی فایل های هدر و سورس و .lib کتابخانه به بخش Tools | Options, Directories برای چیست؟
یا حتی در بعضی کتابخانه ها، باید همین فولدر(فولدر حاوی فایل های لازم کتابخانه) را به لینکر و خود C++ ، برای هر پروژه ای منحصراً اضافه کرد!(مثلا کتابخانه Crypto++ نمونه ای از این دست می باشد)

حالا یک تصور برای من بوجود آمده و آن این است که:
در صورتیکه تعداد فایل های ( سورس و هدر و lib) یک کتابخانه زیاد باشد که کپی کردن آنها درون فولدر پروژه، فولدر را شلوغ کند، از روش جایگزین Tools | Options, Directories می توان استفاده کرد!(یعنی تصور می کنم اضافه کردن فایل های لازم کتابخانه از این طریق هیچ ضرورتی ندارد و فقط برای سهولت استفاده و روشی جایگزین به جای کپی کردن کلیه فایل های کتابخانه درون فولدر پروژه می باشد.)

2- آیا این تصور من درست است؟

3- سوال دیگر این که چرا برای استفاده از بعضی کتابخانه ها، باید در هر پروژه ای فولدر حاوی فایل های لازم کتابخانه را به لینکر و خود C++ هم اضافه کرد تا پروژه به درستی کامپایل و اجرا گردد؟

4- به طور کلی، آیا یک روند کلی برای اضافه کردن یک کتابخانه به ویژوال C++ وجود دارد که در پروژه های مختلف بتوان از آن استفاده کرد یا این بستگی به کتابخانه مورد نظر دارد و هر کتابخانه ای بنا به مقتضیات خود می تواند به ویژوال C++ اضافه گردد؟

ممنون میشوم اگر مثل همیشه کامل و مفید راهنمایی بفرمایید

Nima_NF
یک شنبه 20 بهمن 1387, 18:29 عصر
1 و 2 - اگر شما این فایل ها را مستقیم به داخل پروژه اضافه کنید و به لینکر اضافه نکنید، فردا اگر یک نسخه جدید کامپایلر VC یا (کلا یک کامپایلر دیگر) گرفتید و یا حتی مثلا یک service pack جدید یا یک جدید SDK نصب کردید آنگاه برنامه شما دیگر درست کامپایل نمی شود، چون که مسیر کتابخانه ها و فایل ها تغییر کرده است پس خطا دریافت می کنید. از طریق linker فقط در داخل فایل های متصل شده به کامپایلر نام کتابخانه یا فایل جستجو می شود بدون مسیر آن. (ضمنا اگر کتابخانه نوشته ما نیست برای ثابت نگه داشتن مسیر، هرگز کتابخانه ها را در فولدر برنامه کپی نمی کنیم، چون ممکن است نسخه کتابخانه ها با یک update تغییر کند و ما همچنان از نسخه قدیمی استفاده کنیم. به این شکل اگر کتابخانه جدید شود همه برنامه ها در هنگام کامپایل از همان نسخه جدید استفاده می کنند)

اگر در Tools | Options, Directories اضافه می کنید یعنی کتابخانه ای پر کاربرد هست و از این به بعد برای کل کامپایلر مسیر شناخته شده است نه فقط همین پروزه کنونی.
در properties | linker مشخص می کنید کدام کتابخانه از همان فایل های Directories مشخص شده فوق استفاده شود.

3- همانطور که در بالا توضیح دادم، مسیرها باید مشخص باشد تا کامپایلر کل کامپیوتر را برای یافتن فایل ها جستجو نکند.
در مورد include فایل های .h هم هر جایی که آن ها را در برنامه اضافه می کنید مثل این است که محتویات آن را در همان قسمت فایل کپی می کنید.

4- در مورد 1و 2 توضیح داده شد، یعنی همواره از Tools | Options, Directories برای شناساندن فولدرهای حاوی کتابخانه ها به کامپایلر استفاده می کنید و از properties | linker برای شناساندن فایل هایی که می خواهید در پروژه کنونی استفاده کنید.

نکته: در صورتی که پروژه کنونی شما یک dll به علاوه یک فایل exe می سازد روش های دیگری هست که مثلا با add dependency در منوی project می توان lib را بدون نیاز به کاری آن را در هنگام کامپایل به طور خودکار به مسیر کنونی پروژه کپی کرد. که پروژه شما فعلا نیازی به آن ندارد.

(در همه کامپایلر ها به شکل فوق مسیر هایی با عناوین مشابه وجود دارد و همین کارها را باید انجام دهید)