Известно, что цель библиотек в C — упорядочить функции, которые мы создаем и с которыми работаем. Чтобы избежать ошибок и быть эффективными, программисты должны быть организованы в своей работе, но какая библиотека будет лучше: статическая библиотека или динамическая библиотека (также известная как общая библиотека)?
В предыдущем посте мы говорили о том, что такое статическая библиотека и как ее создать, вы можете увидеть это по ссылке ниже:
https://medium.com/@kenneth.ca95/what-you-need-to-know-about-c-static-libraries-69842f925e0a
Основное отличие от Статических библиотек и Динамических библиотек, в Статике компоновщик делает копию всех выбранных функций для библиотеки в исполняемый файл, а в Динамических это не нужно. Это означает разницу в использовании памяти, а также в риске повреждения данных и в том, насколько легко обрабатывается код.
Как создать динамическую библиотеку
Способ создания динамической библиотеки в Linux заключается в использовании команды gcc
с использованием -c
для создания объектных файлов (.o) из исходных файлов (.c) и -fPIC
для независимости позиции кода. Таким образом, следующая команда создает группу файлов .o из каждого файла .c в текущем каталоге (вы можете выбрать, какие функции вы хотите использовать для своей библиотеки).
gcc -c -fPIC *.c
Далее мы собираемся собрать эти файлы объектов в одну библиотеку. Для этого в качестве динамической библиотеки мы также используем gcc
, но с опцией -shared
. -o
указывает имя файла, который вы хотите иметь.
gcc -shared -o liball.so *.o
Таким образом, вы должны создать свою библиотеку. Чтобы убедиться, что вы это сделали и имеете правильные функции в качестве динамических символов, вы можете использовать:
nm -D liball.so
Здорово! на данный момент у вас создана динамическая библиотека!
Как это использовать
Теперь вам нужно скомпилировать библиотеку с вашим файлом main.c, чтобы связать ее и использовать по своему усмотрению. Чтобы это работало, вы должны добавить расположение файлов вашей библиотеки в переменную окружения, чтобы знать, где найти функции.
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
Затем вы можете скомпилировать его, набрав следующее:
gcc -L . 0-main.c -l all -o example
Обратите внимание, что имя, которое мы дали библиотеке в этом примере, было all. Здесь мы используем параметр -L
, чтобы сообщить программе, где найти библиотеку, в данном случае .
, которая указывает на текущий каталог. Параметр -l
указывает компилятору искать библиотеку.
Бонус: используйте его в Python
С Python вы можете импортировать библиотеки, которые вы создаете в C, все, что вам нужно сделать, это импортировать ctypes и использовать CDDLL
вот так:
#!/usr/bin/python3
import ctypes
spam = ctypes.CDLL(‘./liball.so
’)
Затем вы можете использовать свои ранее созданные функции по своему усмотрению. Допустим, вы хотите вызвать функцию с именем abs из своей библиотеки, тогда вы можете вызвать ее как spam.abs.
И это все, надеюсь, вам понравится!