В чем разница между общими и динамическими библиотеками в C? - PullRequest
0 голосов
/ 05 июля 2019

Я не понимаю разницы между двумя типами библиотек, и многие веб-сайты говорят, что это одно и то же, но в школе мы используем две разные команды для их создания

динамическая библиотека

$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -ldl

для выполнения:

$ ./main ./libsample.so

общая библиотека

$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -L. -lsample

для выполнения:

$ LD_LIBRARY_PATH=. ./main

Может ли кто-нибудь помочь мне понять разницу между двумя "кодами"?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Динамическая Связанная библиотека (.DLL) - это терминология, используемая Microsoft Windows. Shared Object (.so) - терминология, используемая Unix и Linux.

Концептуально они одинаковы.

Относительно ваших фрагментов командЯ думаю, разница (и я только догадываюсь здесь, потому что вы не показали нам соответствующие части) заключается в том, как загружается библиотека.Существует «загрузка времени ссылки» , где библиотека связана с исполняемым файлом компоновщиком¹.И есть «загрузка во время выполнения» , где программа как бы «поглощает» динамическую / разделяемую библиотеку.

загрузка во время выполнения выполняется в Windows с LoadLibrary (есть вариант …A и …W вариант) и в Unix / Linux с dlopen (который доступен через libdl, с которым связана эта библиотека -ldlоператор link).


1: компоновщик - это программа, которая создает фактически исполняемый файл из промежуточных объектов, созданных на различных этапах компиляции.

0 голосов
/ 05 июля 2019

Динамические и разделяемые библиотеки обычно одинаковы. Но в вашем случае это выглядит так, как будто вы делаете что-то особенное.

  • В случае общая библиотека вы указываете общую библиотеку во время компиляции. Когда приложение запускается, операционная система загружает общую библиотеку до запуска приложения.

  • В случае динамической библиотеки библиотека не указывается во время компиляции, поэтому она не загружается операционной системой. Вместо этого ваше приложение будет содержать некоторый код для загрузки библиотеки.

Первый случай - нормальный случай. Второй случай - это специальное использование, и оно в основном уместно, если ваше приложение поддерживает такие расширения, как плагины . Динамическая загрузка необходима, потому что может быть много плагинов, и они создаются после вашего приложения. Поэтому их имена не доступны во время компиляции.

...