کتابخانه ها در کامپایلر ها

1

کتابخانه ها در کامپایلر چه کاربردی دارند ؟

حسین برخورداری سوال پاسخ داده شده اکتبر 13, 2020
گذاشتن نظر
1

کتابخانه ها در کامپایلر چه کاربردی دارند ؟
کتابخانه های 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>
حسین برخورداری سوال پاسخ داده شده اکتبر 13, 2020
گذاشتن نظر
شما در حال مشاهده 1 از 1 پاسخ هستید ، برای دیدن همه پاسخها اینجا را کلیک کنید .
پاسخ خود را بنویسید .
  • فعال
  • بازدیدها1513 times
  • پاسخ ها1 پاسخ
ورود به متاورس | متاورس ایرانی
ورود به متاورس ایران یا همان متاورس ملی

علامت ذره بین Tutorials سمت راست به رنگ قرمز به شما کمک خواهد کرد .

جدید ترین سوالات پرسیده شده

منقضی شدن سم بتانال 1 پاسخ | 0 آرا
ایا ایدز گزفتم؟ 0 پاسخ ها | 0 آرا
انتخاب ورزش رزمی 0 پاسخ ها | 1 رای
وزارت تعاون کار و رفاه اجتماعی نماد اعتماد الکترونیک اسناد و املاک کشور مرکز آموزش ویدیویی انجمن حم فروشگاه ملی تولید کنندگان مدیریت بر مدیران حم سامانه حیوانات رسانه ملی اخبار متا دانشگاه متاورس استخدام | دانش فروشگاه حم تبلیغات ملی بازار NFT متاورس رنگ نقشه ملی سه بعدی متا املاک و مستغلات