Библиотеки времени выполнения#

Чтобы продемонстрировать, что даже простая программа зависит от внешних библиотек времени выполнения (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», чтобы узнать, какие библиотеки загружены и где они находятся.

Если вы хотите поделиться своей программой с коллегами, клиентами или просто пользователями по всему миру, вам придётся позаботиться о том, чтобы помимо самой программы, распространить и библиотеки, от которых она зависит. Дополнительные сведения о распространении программы и библиотек приведены в одном из следующих разделов.