Библиотеки времени выполнения#
Чтобы продемонстрировать, что даже простая программа зависит от внешних библиотек времени выполнения (run-time libraries), ниже представлен результат вывода утилиты ldd
, которая сообщает о таких зависимостях:
$ ldd tabulate.exe
ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ff88f2b0000)
KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ff88e450000)
KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ff88b9e0000)
cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
cyggfortran-5.dll => /usr/bin/cyggfortran-5.dll (0x3efd20000)
cygquadmath-0.dll => /usr/bin/cygquadmath-0.dll (0x3ee0b0000)
cyggcc_s-seh-1.dll => /usr/bin/cyggcc_s-seh-1.dll (0x3f7000000)
Другие компиляторы или другие версии одного и того же компилятора, возможно, потребуют другие динамические библиотеки. Пока вы запускаете программу на одном и том же компьютере – или, точнее, в одной и той же среде, – проблем быть не должно. Однако, если такая библиотека не найдена, вы получите (будем надеяться) сообщение об ошибке и программа немедленно завершится.
Поэтому необходимо знать, какие библиотеки требуются. В операционных системах Linux и Linux-подобных рабочих окружениях большую помощь в этом окажет утилита ldd
. В операционной системе Windows вы можете воспользоваться программой dependency walker
(последняя версия, которая работает в Windows 10, находится здесь: lucasg/Dependencies)
Ещё одна вещь, которую вы должны знать, это то, где программа пытается найти эти библиотеки. Это обширная тема сама по себе, полная сложностей и предыстории. Здесь мы лишь поверхностно рассмотрим этот вопрос:
В Linux:
Используется переменная окружения
LD_LIBRARY_PATH
. Она представляет собой список каталогов для поиска, каждый из которых отделяется от другого двоеточием (:). Например:/usr/lib:/usr/local/lib
– типичные системные каталоги.На этапе компоновки вы также можете использовать опцию для задания переменной
RPATH
– списка каталогов, который помещается непосредственно в сам исполняемый файл программы.В этом случае поиск библиотек ведётся по нескольким системным каталогам.
В Windows:
Каталог, содержащий исполняемую программу, может также содержать динамические библиотеки.
Используется переменная окружения «PATH». Это тоже список каталогов для поиска, но теперь разделителем элементов в списке является точка с запятой (;).
Выполняется поиск в наборе системных каталогов.
К сожалению, детали могут меняться от одной версии операционной системы к другой. Приведённые выше сведения являются лишь указанием – используйте такие инструменты как «ldd» или «dependency walker», чтобы узнать, какие библиотеки загружены и где они находятся.
Если вы хотите поделиться своей программой с коллегами, клиентами или просто пользователями по всему миру, вам придётся позаботиться о том, чтобы помимо самой программы, распространить и библиотеки, от которых она зависит. Дополнительные сведения о распространении программы и библиотек приведены в одном из следующих разделов.