کتابخانههای استاتیک و داینامیک (پویا)
توضیحات موردنیاز، قبلاً در اینپیوند داده شده. حال بیاید ببینیم در عمل چگونهاست ؟
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
موفقوپیروز باشید
.
-
1
0 دیدگاه
نظرهای پیشنهاد شده
هیچ دیدگاهی برای نمایش وجود دارد.