Как собрать код в разделяемую библиотеку с помощью gcc
gcc -fPIC -c helloworld.c -o helloworld.o
gcc -shared -Wl,-soname,libhelloworld.so.1 -o libhelloworld.so.1.0.1 helloworld.o
Первая команда компилирует исходник helloworld.c в объектный файл helloworld.o, вторая - создает из объектного файла разделяемую библиотеку helloworld.so.1.0.1.
Следует обратить внимание на следующие вещи.
- Объектники нужно компилировать с опцией -fPIC (position-independent code).
- Линковать разделяемую библиотеку нужно, соответственно, с опцией -shared.
- Опция -Wl позволяет задать опции для линковщика, в данном случае, soname.
- soname - имя, которое известно программе, которая будет использовать библиотеку. Оно должно предваряться префиксом "lib", а заканчиваться ".so.X", где Х - номер версии, который изменяется когда изменяется интерфейс библиотеки.
- Опция -o задает имя выходного файла, которое должно представлять собой soname дополненное через точку минорным номером версии (minor number) и номером релиза.
- У всех разделяемых библиотек в Linux есть еще третье имя - имя, которое использует компилятор. Это soname без номера версии.
Как установить созданную библиотеку в Linux
lib_name = libhelloworld.so.1
lib_full_name = libhelloworld.so.1.0.1
lib_short_name = libhelloworld.so
lib_install_path = /usr/lib
lib_include_path = /usr/local/include
install: so
sudo install -m 0644 $(lib_full_name) $(lib_install_path)
sudo ln -sf $(lib_install_path)/$(lib_full_name) $(lib_install_path)/$(lib_short_name)
sudo ldconfig -n $(lib_install_path)
sudo cp helloworld.h $(lib_include_path)
.PHONY: install
Этот фрагмент makefile добавляет цель install, то есть теперь можно выполнить команду make install и библиотека будет установлена в /usr/lib.
- Команда "install" копирует заданный файл библиотеки по заданному пути и создает символьную ссылку на него с именем, заданным в soname. Опция -m позволяет задать также права доступа для файла (644 - разрешение на запись и чтение для владельца файла, чтение для пользователей той же группы, чтение для остальных пользователей).
- Команда "sudo ln -sf" создает символьную ссылку с перезаписью существующей (если такая уже есть) на файл только что установлненой библиотеки с именем для компилятора (soname без версии). После этой команды в заданном каталоге присутствуют файлы библиотеки со всеми тремя ранее перечисленными именами.
- Команда "sudo ldconfig -n" перечитывает заданный каталог (опция -n) и обновляет кэш. После этого линкер и другие программы могут запрашивать библиотеку по имени (например, по soname). Можно вывести список всехъ загруженных библиотек с помощью команды "ldconfig -p".
- Далее в случае необходимости можно скопировать заголовочные файлы библиотеки.
- Цель "install" должна создаваться как phony-target (потому, что в результате ее выполнения не собирается новый файл).
Комментариев нет :
Отправить комментарий