Как собрать код в разделяемую библиотеку с помощью gcc
1 2 | gcc -fPIC -c helloworld.c -o helloworld.o gcc -shared -Wl,-soname,libhelloworld.so.1 -o libhelloworld.so.1.0.1 helloworld.o |
- Объектники нужно компилировать с опцией -fPIC (position-independent code).
- Линковать разделяемую библиотеку нужно, соответственно, с опцией -shared.
- Опция -Wl позволяет задать опции для линковщика, в данном случае, soname.
- soname - имя, которое известно программе, которая будет использовать библиотеку. Оно должно предваряться префиксом "lib", а заканчиваться ".so.X", где Х - номер версии, который изменяется когда изменяется интерфейс библиотеки.
- Опция -o задает имя выходного файла, которое должно представлять собой soname дополненное через точку минорным номером версии (minor number) и номером релиза.
- У всех разделяемых библиотек в Linux есть еще третье имя - имя, которое использует компилятор. Это soname без номера версии.
Как установить созданную библиотеку в Linux
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
- Команда "install" копирует заданный файл библиотеки по заданному пути и создает символьную ссылку на него с именем, заданным в soname. Опция -m позволяет задать также права доступа для файла (644 - разрешение на запись и чтение для владельца файла, чтение для пользователей той же группы, чтение для остальных пользователей).
- Команда "sudo ln -sf" создает символьную ссылку с перезаписью существующей (если такая уже есть) на файл только что установлненой библиотеки с именем для компилятора (soname без версии). После этой команды в заданном каталоге присутствуют файлы библиотеки со всеми тремя ранее перечисленными именами.
- Команда "sudo ldconfig -n" перечитывает заданный каталог (опция -n) и обновляет кэш. После этого линкер и другие программы могут запрашивать библиотеку по имени (например, по soname). Можно вывести список всехъ загруженных библиотек с помощью команды "ldconfig -p".
- Далее в случае необходимости можно скопировать заголовочные файлы библиотеки.
- Цель "install" должна создаваться как phony-target (потому, что в результате ее выполнения не собирается новый файл).
Комментариев нет :
Отправить комментарий