جستجو در تالارهای گفتگو
در حال نمایش نتایج برای برچسب های 'کتابخانههایاشتراکی'.
1 نتیجه پیدا شد
-
توضیحات موردنیاز، قبلاً در اینپیوند داده شده. حال بیاید ببینیم در عمل چگونهاست ؟ Static Library یا کتابخانههای استاتیک : معمولاً تحت عنوان Archives هم شناخته میشوند، یک Static Library شامل مجموعهای از Object-Fileها هست. Object-Fileها سورسهای کامپایل شدهٔ ما به زبانماشین هستند. این فایلها قابل اجرا نیستند چراکه هنوز کتابخانههای موردنیازشان Link نشده. برای کامپایل بهصورت Object-File از فلگ -c استفاده میکنیم : $> cc -c func.c $> cc -c main.c $> cc *.o -o output در اینجا ما سورسکدهای func.c و main.c را فقط کامپایل کردیم و بعد (در خط سوّم) Object-Fileها را به کامپایلرمان دادیم تا عمل لینک کردن کتابخانهها و خروجینهایی را تولید کند. برای ساخت Static Library ما از Object-Fileها به همراه برنامهٔ ar استفاده میکنیم، به اینصورت که اوّل Object-Fileها را تولید میکنیم : $> cc -c func1.c $> cc -c func2.c و حالا یک کتابخانه متشکل از Object-Fileها برای ساخت Static-Libraryمان خروجی میگیریم : $> ar rcs libfunc.a func1.o func1.o خب ! در این قسمت دو نکتهٔ کوچک و مهم وجود دارد : فایلهایی که با استفاده از فلگ -c کامپایل میکنید، خروجیحاصل فایلی با همان نام فایل ورودی به همراه پسوند .o میباشد. اسم کتابخانهٔ شما باید بهصورت lib*.(a|os) باشد. و اینچیزی هست که Linker به دنبال آن برای لینککردن میگردد. برای کتابخانههایاستاتیک ما از پسوند .a استفاده میکنیم و برای کتابخانههایداینامیک از .so . حال برای استفاده از این کتابخانهما نیاز به دوکار کوچک داریم هنگام کامپایل نهایی داریم : $> cc main.c -L. -lfunc -o output فلگ -L برای مشخص کردن دایرکتوریای که کتابخانهٔ ما در آن قرار دارد استفاده میشود. (میدانیم که در UNIX هر دایرکتوری دارای دو لینک میباشد؛ یک . (dot) که اشاره به دایرکتوری جاری دارد و.. (dot-dot) که اشاره به دایرکتوری-پدر (parent-directory یا دایرکتوری بالایی دارد). فلگ -l برای مشخص کردن اسم کتابخانهٔ ما استفاده میشود، دیدید که ما فقط اسم func را آوردیم، چرا که خود تصور میکند اوّل اسم فایل lib و پسوند آن .a یا .so میباشد. یک نمونهٔ عملی را میتوانید از اینقسمت امتحان کنید : در این مثال از GNU Make استفاده شده است، درصورتیکه آشنایی ندارید میتوانید از اینقسمت با GNU Make آشنا بشوید. امّا نکتهای که قابل ذکر هست : در اینجا شما فقط کتابخانهای که خودتان نوشتید را بهصورت Static لینک کردید، کتابخانههایی مثل glibc بهصورت خودکار درحالت Dynamic لینک میشوند. Shared Library یا کتابخانه داینامیک : در این روش بازهم ما نیاز به Object-Fileهای سورسکدها داریم، با تفاوت اینکه باید فلگ -fPIC یا -fpic را اضافه کنیم که به معنی Position-independent Code میباشد؛ میدانید که Shared Libraryها یکبار فقط در حافظه بارگذاری میشوند از این رو نیاز است که سورسکدماشینی که تولید میشوند وابسته به این نباشد که در جای به خصوصی از حافظه بارگذاری شود. خب Object-Fileها را به صورت PIC کامپایل میکنیم : $> cc -c -fPIC add.c $> cc -c -fPIC sub.c حال باید کتابخانهٔاشتراکی خود را با استفاده از فلگ -shared ایجاد کنیم : $> cc -shared add.o sub.o -o libmat.so در اینجا ما از فلگ -shared استفاده کردیم و Object-Fileهای تولیدشده را به عنوان ورودی وارد کردهایم. و حالا میتوانیم از shared library خودمان استفاده کنیم : $> cc main.c -o output -L. -lmath حال بیاید برنامه را اجرا کنیم : $> ./output ./output: error while loading shared libraries: libmat.so: cannot open shared object file: No such file or directory چرا ؟ به خاطر اینکه linker در آدرسهای تعریف شده به دنبال کتابخانهٔاشتراکی libmat.so میگردد. راههای مختلفی برای مشخص کردن مسیر کتابخانهٔ خودمان وجود دارد. انتقال کتابخانهٔ خود به آدرس /usr/lib دستکاری LD_LIBRARY_PATH ... راههای مختلف را میتوانید از لینکهای زیر دنبال کنید : https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/GCC/create-libraries/index https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html موفقوپیروز باشید ?.
-
- shared-lib
- کتابخانههایاستاتیک
-
(و 4 مورد دیگر)
برچسب زده شده با :