(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

C/C++ Создание своих библиотек на gcc

Источник: habrahabr

Ниже описанное в принципе является общеизвестным, тем не менее надеюсь, что пост облегчит кому-нибудь жизнь. Так же хочу оговориться, что пост ориентирован на пользователей linux, хотя с небольшими изменениями может быть использован и на других платформах.

 Под катом я объясню как создать свою динамическую библиотеку, и как подключить ее к своим проектам. Так же будет немного информации о статических библиотеках.

Небольшое отступление

 Программируя одним прекрасным морозным утром был не приятно удивлен тем, что мой gcc напрочь отказывается переваривать функцию swap(), тогда я не заострил на этом внимание, но постепенно я нуждался в swap все больше и больше. И вот мое терпение закончилось. А результаты вы увидите ниже.

От слов к делу

 И так, что же такое библиотека?
 Библиотека - это набор скомпонованных особым образом объектных файлов. Библиотеки подключаются к основной программе во время линковки. По способу компоновки библиотеки подразделяют на архивы (статические библиотеки, static libraries) и совместно используемые (динамические библиотеки, shared libraries).
 Статические библиотеки чаще всего имеют вид "*.a", а динамические ".so"

 Статическая библиотека - это просто архив объектных файлов, который подключается к программе во время линковки. Эффект такой же, как если бы вы подключали каждый из файлов отдельно.

 В отличие от статических библиотек, код совместно используемых (динамических) библиотек не включается в бинарник. Вместо этого в бинарник включается только ссылка на библиотеку.

 В рамках поста будет описан способ создания динамической библиотеки.

 Для простоты будет приведен пример, который запрашивает ввод 2х чисел с клавиатуры, меняет их местами и выводит на экран. Операция обмена будет представлена в виде библиотеки.

От теории к практике

 Программный код основной программы (main.c)

#include <stdio.h>

int main (void)
{
    int x,y;
    scanf ("%d%d",&x,&y);
    swap (&x,&y);
    printf ("x=%d y=%d\n",x,y);
    return 0;
}

 А теперь код библиотеки (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 педназначена для вызова линковщика и создания динамической библиотеки.

gcc -c -fPIC swap.c опция -fPIC (-fpic) при компиляции swap.c. Эта опция сообщает компилятору, что объектные файлы, полученные в результате компиляции должны содержать позиционно-независимый код (PIC - Position Independent Code), который используется в динамических библиотеках. В таком коде используются не фиксированные позиции (адреса), а плавающие, благодаря чему код из библиотеки имеет возможность подключаться к программе в момент запуска.

 Вот и все, теперь с радостью и нетерпением пишем "make". В итоге мы должны получить следующие файлы: MAIN, main.c, main.o, swap.c, swap.o, libuser.so, Makefile

 Для приминения написанной нами библиотеки копируем файл libuser.so в /usr/lib/<имя библиотеки>.so

 Теперь если в других проектах нам понадобиться обратиться к функции swap, нам достаточно будет следующей конфигурации Makefile

#Mkefile

MAIN: main.c
    gcc -o MAIN main.c -luser

 Ключевым параметром, как вы уже поняли, является -luser. В остальном же вы можете конфигурировать данный файл по своему усмотрению.

Заключение

 Так же если будет необходимость могу написать небольшие посты-обзоры методов создания статических библиотек и более подробный help по Makefile.
 К слову сам я в итоге отказался от использоване библиотек (по причине того, что в данный момент не занимаюсь написанием сколько нибудь сложных программ) и использую заголовочные файлы (В языке C это файлы с расширением .h).

Ссылки по теме


 Распечатать »
 Правила публикации »
  Обсудить материал в конференции Embarcadero »
Написать редактору 
 Рекомендовать » Дата публикации: 08.12.2011 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Enterprise Connectors (1 Year term)
Delphi Professional Named User
Symantec Endpoint Encryption, License, 1-24 Devices
ZBrush 4R6 Win Commercial Single License ESD
IBM DOMINO COLLABORATION EXPRESS AUTHORIZED USER LICENSE + SW SUBSCRIPTION & SUPPORT 12 MONTHS
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Мир OLAP и Business Intelligence: новости, статьи, обзоры
Delphi - проблемы и решения
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Разработка программ базы данных (63)
Написание прикладных компьютерных программ (базы данных) на заказ. Разработка корпоративных...
 
Кухня (4)
Хочу сделать ремонт на кухне. Где приобрести кухонную плиту? Какой фирмы стоит её рассматривать?
 
Как в IBM Rational DOORS сделать заголовки не жирным шрифтом? (2)
Измучился уже, когда идет иерархия уровнем ниже, чем Х.Х., мне нужно, чтобы заголовки не...
 
Ищу программиста для написания программы (62)
Ищу программиста ,владеющего Вижуал Бэйсик и программированием в Экселе, для написания...
 
Отличается ли ДрифтКазино от беттинга? (18)
Друзья, давно заметил, что на Дрифте уже несколько месяцев во всю рекламируется и предлагается...
 
 
 



    
rambler's top100 Rambler's Top100