کتابخانه ها در کامپایلر ها
کتابخانه ها در کامپایلر چه کاربردی دارند ؟
کتابخانه ها در کامپایلر چه کاربردی دارند ؟
کتابخانه های C
به طور کلی ، کتابخانه ها از بسیاری از پرونده های منبع کتابخانه ایجاد می شوند و یا به عنوان پرونده های بایگانی (libmine.a) ساخته می شوند که از لحاظ ایستایی به اجراهایی که از آنها استفاده می کنند پیوند دارند یا به عنوان پرونده های شی مشترک (libmine.so) که به صورت پویا به اجراهای پیوند داده می شوند ، ساخته می شوند. که از آنها استفاده می کند برای پیوند دادن در کتابخانه های این نوع ، از گزینه های خط فرمان gcc -L برای مسیر پرونده های کتابخانه و -l برای پیوند دادن در کتابخانه (a .so یا aa) استفاده کنید:
<span> -L {مسیر فایل حاوی کتابخانه} -l $ {نام کتابخانه} </span>
به عنوان مثال ، اگر من کتابخانه ای به نام libmine.so در / home / newhall / lib / داشته باشم ، برای پیوند دادن آن به برنامه خود موارد زیر را انجام می دهم:
<span> $ gcc -o myprog myprog.c -L / home / newhall / lib -lmine </span>
همچنین ممکن است لازم باشد مسیر را مشخص کرده و وارد کنید تا کامپایلر بتواند پرونده هدر کتابخانه را پیدا کند: -I / home / newhall / include
اگر پرونده های جسم مشترک خود را ایجاد کرده و آنها را در / usr / lib نصب نکنید ، باید متغیر محیط LD_LIBRARY_PATH خود را تنظیم کنید تا لینک دهنده زمان اجرا بتواند آنها را پیدا کند و در زمان اجرا بارگیری کند. به عنوان مثال ، اگر پرونده های .so خود را در پوشه ای به نام lib در فهرست خانه خود قرار دهم ، محیط LD_LIBRARY_PATH خود را بر روی موارد زیر قرار می دهم:
<span> # اگر در حال اجرا bash:</span><span> صادرات LD_LIBRARY_PATH = / خانه / newhall / lib: $ LD_LIBRARY_PATH</span> <span> # اگر tcsh را اجرا می کنید:</span><span> setenv LD_LIBRARY_PATH / خانه / newhall / lib: $ LD_LIBRARY_PATH</span>
استفاده و پیوند کد کتابخانه
<span>برای استفاده از کتابخانه ای که توسط آن به طور خودکار به برنامه شما پیوند داده نشود</span><span> کامپایلر ، شما باید (1) فایل هدر کتابخانه را در خود وارد کنید</span><span> فایل منبع C (test.c در مثال زیر) ، و (2) به کامپایلر بگویید</span><span> کد موجود در فایل .o کتابخانه را به فایل اجرایی خود پیوند دهید:</span> <span> مرحله 1: یک خط شامل (# شامل "somelib.h") در یک برنامه اضافه کنید </span><span> پرونده منبع (به عنوان مثال ، test.c).</span> <span> مرحله 2: پرونده .c برنامه را با پرونده شی کتابخانه پیوند دهید </span><span> (به عنوان مثال فایل somelib.o را به عنوان آرگومان خط فرمان برای gcc مشخص کنید): </span> <span> ٪ gcc -o myprog test.c somelib.o</span> <span> فایل اجرایی حاصل شده (myprog) حاوی کد دستگاه خواهد بود </span><span> برای همه توابع تعریف شده در test.c به علاوه هر کتابخانه mylib </span><span> توابعی که توسط آنها فراخوانی می شوند </span>
ایجاد و استفاده از کد کتابخانه خود
برای ایجاد کتابخانه کد ، باید موارد زیر را انجام دهید:
- (1) یک رابط برای کتابخانه خود ایجاد کنید: mylib.h
- (2) یک پیاده سازی از کتابخانه خود ایجاد کنید: mylib.c
- (3) یک کتابخانه OBJECT FILE (.o) ایجاد کنید که می تواند با برنامه هایی که از کتابخانه شما استفاده می کنند پیوند داشته باشد
- (3a) یا از بسیاری از پرونده های .o که می توانند به صورت پویا با برنامه هایی که از کتابخانه شما استفاده می کنند پیوند مشترک (.so) را ایجاد کنید
- (3b) یا یک ARCHIVE FILE (.a) از بسیاری از پرونده های o ایجاد کنید که می تواند به صورت ایستایی با برنامه هایی که از کتابخانه شما استفاده می کنند پیوند داشته باشد
- (4) از کتابخانه در کد C دیگر استفاده کنید: (الف) پیوند “mylib.h” (ب) را در کد libary به پرونده a.out وارد کنید
- (5) تنظیم متغیر محیط LD_LIBRARY_PATH برای یافتن اشیا shared مشترک در مکان های غیر استاندارد در زمان اجرا
جزئیات:
- (1) INTERFACE: پرونده هدر به کتابخانه شما باید شامل تعاریفی برای همه موارد صادر شده توسط کتابخانه شما باشد:
- نمونه های اولیه عملکرد با نظرات کاربران برای توابع کتابخانه شما
- تعاریف مربوط به انواع و متغیرهای جهانی صادر شده توسط کتابخانه شما
برای اطمینان از اینکه پیش پردازنده فقط یکبار پرونده mylib.h را شامل می شود ، باید کد “صفحه دیگ بخار” (#ifndef … #endif) در اطراف محتوای فایل هدر داشته باشید.
در اینجا نمونه ای از پرونده .h به نظر می رسد:
<span>#ifndef _MYLIB_H_</span><span> # تعریف _MYLIB_H_</span> <span> // یک تعریف ثابت که توسط کتابخانه صادر می شود:</span><span> # تعریف MAX_FOO 20</span> <span> // یک تعریف از نوع صادر شده توسط کتابخانه:</span><span> ساختار foo_strukt { </span><span> int x ؛</span><span> شناور y</span><span> }؛</span><span> typedef ساختار foo_struct foo_struct؛</span> <span> // یک متغیر جهانی که توسط کتابخانه صادر می شود</span><span> // "extern" به این معنی است که این یک اعلامیه متغیر نیست ، بلکه </span><span> // فقط تعریف می کند که متغیری به نام total_foo از نوع int است</span><span> // خارج می شود و می توانید از آن استفاده کنید (اعلامیه آن در برخی از پرونده های منبع کتابخانه است)</span><span> extern int total_foo؛ </span> <span> // نمونه اولیه تابع برای تابعی که توسط کتابخانه صادر می شود:</span><span> extern int foo (float y ، float z) ؛ // یک نام عملکرد بسیار بد</span> <span> # اندیف</span>
- (2) پیاده سازی: یک فایل mylib.c ایجاد کنید که # “شامل mylib.h” باشد و شامل اجرای هر عملکرد در کتابخانه شما باشد.
<span> # شامل "mylib.h"</span> <span> ...</span><span> int total_foo؛</span> <span> int foo (float y ، float z) { </span><span> ...</span><span> }</span>
- (3) یک فایل LIBRARY OBJECT FILE ایجاد کنید که می تواند به برنامه های دیگری که از کتابخانه شما استفاده می کنند پیوند داده شود (از گزینه -c برای gcc استفاده کنید تا به آن بگویید فقط برای ایجاد یک فایل شی (یک فایل .o) به جای قابل اجرا:
<span> gcc -o mylib.o -c mylib.c </span>
سپس می توانید از فایل mylib.o به عنوان “پرونده کتابخانه” استفاده کرده و آن را به صورت استاتیک به سایر برنامه هایی که از آن استفاده می کنند پیوند دهید یا …
- (3a) به طور متناوب ، می توانید از یک یا چند پرونده .o که می تواند به برنامه های دیگری که از کتابخانه شما استفاده می کنند پیوند داده شود ، یک پرونده مشترک به اشتراک بگذارید. یک فایل شی shared مشترک نام Unix برای کتابخانه ای است که به صورت پویا پیوند داده شده و کد آن در پرونده خارج از برنامه در زمان اجرا. برای ایجاد یک فایل .so از پرچم به اشتراک گذاشته شده برای gcc استفاده کنید. در اینجا یک نمونه ساخت به نظر می رسد:
<span> gcc -shared -o libmylib.so mylib.o blah.o grr.o -lm </span>
- (3b) همچنین می توانید از یک یا چند پرونده اگر با یک کتابخانه استاتیک پیوند برقرار کنید ، کد آن در زمان اجرا در پرونده a.out کپی می شود.برای اطلاعات بیشتر در مورد نحوه ساخت فایل های .a و .so به اسناد gcc مراجعه کنید.
- (4) استفاده از کتابخانه در برنامه های دیگر:
<span> مرحله 1: در تمام پرونده های منبع برنامه که از تعاریف کتابخانه استفاده می کنند (مثلا test.c) یک خط شامل (# شامل "mylib.h") اضافه کنید.</span> <span> مرحله 2: پرونده .c برنامه را با پرونده شی کتابخانه پیوند دهید </span><span> (به عنوان مثال فایل mylib.o را به عنوان آرگومان خط فرمان برای gcc مشخص کنید): </span> <span> آزمون gcc.c mylib.o</span> <span> یا برای پیوند دادن در libmylib.so (یا libmylib.a):</span> <span> آزمون gcc.c -lmylib</span> <span> یا برای پیوند با کتابخانه ای که در مسیر استاندارد نیست:</span> <span> test gcc.c -L / home / newhall / lib -lmylib</span> <span> a.out خارج حاوی کد ماشین برای همه توابع است </span><span> در test.c به علاوه هر توابع کتابخانه mylib که توسط آنها فراخوانی می شوند تعریف شده است </span><span> کد test.c </span>
(5) اجرای یک مورد اجرایی مرتبط با یک پرونده شی مشترک:
<span> اگر پرونده اشیا shared مشترک در / usr / lib نیست ، پس باید پرونده خود را تنظیم کنید </span><span> متغیر محیط LD_LIBRARY_PATH تا لینک دهنده زمان اجرا بتواند آن را پیدا کند </span><span> و فایل .so خود را در زمان اجرا در حالت اجرایی بارگیری کنید:</span> <span> # در bash:</span><span> صادرات LD_LIBRARY_PATH = / خانه / newhall / lib: $ LD_LIBRARY_PATH</span> <span> # در tcsh:</span><span> setenv LD_LIBRARY_PATH / خانه / newhall / lib: $ LD_LIBRARY_PATH منبع : <a href="https://www.cs.swarthmore.edu/~newhall/unixhelp/howto_C_libraries.html" target="_blank" rel="noopener">www.cs.swarthmore.edu</a></span>