g++ -o myprog.exe file1.cpp file2.cpp
مثال حالت دوم
> g++ -c file1.cpp
> g++ -c file2.cpp
> g++ -o myprog.exe file1.o file2.o
اگر بخواهیم مجموعه ای از کد ها را از برنامه ای به برنامه دیگر ببریم و از آن استفاده کنیم آن را به کتابخانه تبدیل می کنیم
یعنی اینکه چند فایل منبع را به یک فایل با پسوند .so
تبدیل می کنیم.
groups together multiple compiled object code files into a single file known as a library.
کتابخانه هایی که بزرگ هستند را معمولا به صورت پویا ایجاد می کنند به این صورت کتابخانه ها از فایل های اجرایی جدا می شوند و توسعه برنامه ها سریعتر می شود
There are two Linux C/C++ library types which can be created:
- Static libraries (.a): Library of object code which is linked with, and becomes part of the application.
- Dynamically linked shared object libraries (.so): There is only one form of this library but it can be used in two ways.
- Dynamically linked at run time but statically aware. The libraries must be available during compile/link phase. The shared objects are not included into the executable component but are tied to the execution.
- Dynamically loaded/unloaded and linked during execution (i.e. browser plug-in) using the dynamic linking loader system functions
به دو صورت یک کتابخانه ایجاد می شود.
کتابخانه های استاتیک که با پسوند
.a
بیشتر دیده می شوند و یک بخش از برنامه هستند. و به برنامه لینک شده اند.
کتابخانه های پویا که بیشتر با پسوند .so
دیده می شوند و که خود به دو صورت
مورد استفاده قرار میگیرند:
حالت اول در زمان اجرا به برنامه وصل می شوند اما از قبل برنامه از وجود آنها آگاهی دارند ومکان آنها را میداند.
یعنی در زمان کامپایل و زمان لینک شدن باید وجود داشته باشند.
کتابخانه های اشتراکی در برنامه اجرایی ادغام نمی شوند اما به برنامه اجرایی متصل هستند.
حالت دوم کتابخانه های پویا در حین اجرا لود و به برنامه اجرایی متصل می شوند.
مثلا یک پلاگین مرورگر
این کار با استفاده از توابع لود لینک سیستم انجام می پذیرد.
Because of the advantage of dynamic linking, GCC, by default, links to the shared library if it is available.
You can list the contents of a library via "nm filename
".
معمولا نام فایل های کتابخانه با پیشوند
lib
شروع می شوند و با پسوند
.a یا so
تمام می شوند. این موضوع در مورد تمام کتابخانه های استاندارد سی حتمی است.
نکته ای که در رابطه با لینک دادن کتابخانه در برنامه هنگام کامپایل مهم است این است که
هنگام لینک دادن به کتابخانه پسوند و پیشوند آورده نمی شود و
خود کامپایلر میداند که باید آنها را اضافه کند.
مثال
gcc src-file.c -lm -lpthread
در اینجا کامپایلر به دنبال فایل های
libm.a و libpthread.a
در مسیر های تعریف شده مانند
/usr/lib
جستجو می کند.
این مسیر ها را میتوان با دستور
cpp -v
دید
متغیر های محیطی در کامپایلر جی سی سی
GCC uses the following environment variables: