C-C++ Створення бібліотек на gcc
Нижче описане у принципі є загальновідомим, проте сподіваюся, що пост полегшить комусь життя. Також хочу обмовитися, що пост орієнтований на користувачів linux, хоча з невеликими змінами може бути використаний і на інших платформах.
Під катом я поясню як створити свою динамічну бібліотеку та як підключити її до своїх проектів. Також буде небагато інформації про статичні бібліотеки.
Невеликий відступ
Програмуючи одним прекрасним морозним ранком був не приємно здивований тим, що мій gcc геть-чисто відмовляється перетравлювати функцію swap(), тоді я не загострив на цьому увагу, але поступово я потребував swap все більше і більше. І ось моє терпіння скінчилося. А результати ви побачите нижче.
Від слів до справи
І що таке бібліотека? Бібліотека - це набір скомпонованих особливим чином об'єктних файлів. Бібліотеки підключаються до основної програми під час лінкування. За способом компонування бібліотеки поділяють на архіви (статичні бібліотеки, static libraries) та спільно використовувані (динамічні бібліотеки, shared libraries). Статичні бібліотеки найчастіше мають вигляд "*.a", а динамічні ".so"
Статична бібліотека – це просто архів об'єктних файлів, який підключається до програми під час лінкування. Ефект такий самий, якби ви підключали кожен із файлів окремо.
У рамках посту буде описано спосіб створення динамічної бібліотеки.
Для простоти буде наведено приклад, який запитує введення 2-х чисел з клавіатури, змінює їх місцями і виводить на екран. Операцію обміну буде представлено у вигляді бібліотеки.
Від теорії до практики
Програмний код основної програми (main.c)
А тепер код бібліотеки (swap.c)
void swap (int *x,int * y) int temp; temp=*x; *x=*y; *y=temp; >
А тепер найцікавіше (Makefile)
#Makefile fo user lib
MAIN: main.o libuser.so gcc -o MAIN main.o -L. -luser -Wl,-rpath,.
main.o: main.c gcc -c main.c libuser.so: swap.o gcc -shared -o libuser.so swap.o swap.o: swap.c gcc -c -fPIC swap.c clean: rm -f *.o
Давайте трохи пригальмуємо і уявимо, що не всі читачі хабра програмісти і знову звернемося до невеликого блоку теорії.
У принципі програмний код дуже простий і вимагає пояснень, тому витратимо час на розуміння Makefile.
Сам по собі Makefile це файл із набором сценаріїв для утиліти make. Сценарії утиліти make прості та багатофункціональні, а формат Makefile використовується повсюдно (і не тільки на Unix-системах). Найголовніша перевага make - це "інтелектуальний" спосіб рекомпіляції: у процесі налагодження make компілює лише змінені файли. Те, що виконує утиліта make, називається збиранням проекту.
libuser.so - назва нашої бібліотеки
gcc -o binary main.o -L. -luser -Wl,-rpath,. - Опція -L вказує лінковнику, де шукати бібліотеку. Якщо бібліотека знаходиться в каталозі /lib або /usr/lib, то питання відпадає саме собою і опція -L не потрібна. -luser – скорочення від libuser.so. Опція-Wl,-rpath,. компілятор gcc сам викликає лінковник ld, коли це треба і передає йому потрібні параметри складання, позбавляючи нас від непотрібної платформно-залежної тяганини. Але іноді ми все-таки маємо втрутитися в цей процес і передати лінковнику "свою" опцію. Для цього використовується опція компілятора -Wl,option,optargs,.… Оскільки лінковник шукає бібліотеки у певних місцях; зазвичай це каталоги /lib та /usr/lib, іноді /usr/local/lib. Опція-rpath додає до цього списку ще один каталог. У нашому випадку це поточний каталог
gcc -shared -o libuser.so swap.o Опція -shared пед призначена для виклику лінковника та створення динамічної бібліотеки.
Ось і все, тепер з радістю та нетерпінням пишемо "make". У результаті ми маємо отримати такі файли: MAIN, main.c, main.o, swap.c, swap.o, libuser.so, Makefile
Для застосування написаної нами бібліотеки копіюємо файл libuser.so у /usr/lib/.so
Тепер якщо в інших проектах нам доведеться звернутися до функції swap, нам достатньо буде наступної конфігурації Makefile
MAIN: main.c gcc -o MAIN main.c -luser
Ключовим параметром, як ви зрозуміли, є -luser. В іншому ж ви можете конфігурувати цей файл на свій розсуд.
Висновок
Так само якщо буде потреба, можу написати невеликі пости-огляди методів створення статичних бібліотек і більш докладний help по Makefile. До речі сам я в результаті відмовився від використання бібліотек (через те, що в даний момент не займаюся написанням скільки-небудь складних програм) і використовую заголовні файли (У мові C це файли з розширенням .h).
Посилання по темі
| Задати питання | |
| програми | |
| навчання | |
| іспити | |
| комп'ютери | |
| Безкоштовний дзвінок | |
| ICQ-консультанти | |
| Skype-консультанти | |
| Загальна довідка | |
| Як оформити замовлення | |
| Тарифи доставки | |
| Способи оплати | |
| Прайс лист | |
| Карта сайту | |
| Популярні статті |
| Інформаційна безпека Антивірусне програмне забезпечення та захист від спаму Eset Software |
| Бестселери |
| Курси навчання "Atlassian JIRA - система управління проектами та завданнями на підприємстві" | |
| Microsoft Office 365 для Будинку 32-bit/x64. 5 ПК/Mac + 5 Планшетів + 5 телефонів. Передплата на 1 рік. Електронний ключ | |
| Microsoft Windows 10 Професійна 32-bit/64-bit. Усі мови. Електронний ключ | |
| Microsoft Office для Будинку та Навчання 2019. Всі мови. Електронний ключ | |
| Курс "Oracle. Програмування на SQL та PL/SQL" | |
| Курс "Основи TOGAF® 9" | |
| Microsoft Windows Professional 10 Sngl OLP 1 License No Level Legalization GetGenuine wCOA (FQC-09481) | |
| Microsoft Office 365 Персональний 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Усі мови. Передплата на 1 рік. Електронний ключ | |
| Windows Server 2016 Standard | |
| Курс "Нотація BPMN 2.0. Її використання для моделювання бізнес-процесів та їх регламентації" | |
| Антивірус ESET NOD32 Antivirus Business Edition | |
| Corel CorelDRAW Home & Student Suite X8 |
| Про нас |
| Інтернет-магазин ITShop.ru пропонує широкий спектр послуг інформаційних технологій та ПЗ. Протягом багатьох років інтернет-магазин пропонує товари та послуги, орієнтовані на бізнес-користувачів та спеціалістів з інформаційних технологій. Хороші відгуки постійних клієнтів тависокий рівень фахівців дає змогу отримати найвищий результат при спільній роботі. |