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