Известно, что цель библиотек в 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.

И это все, надеюсь, вам понравится!