Почему пропавшая общая библиотека фатальна? - PullRequest
2 голосов
/ 04 июля 2011
g++ -o Test Test.cpp -lTest
/usr/bin/ld: cannot find -lTest
collect2: ld returned 1 exit status

Если символы из разделяемых / динамических библиотек загружаются по требованию во время выполнения, почему фатальная ошибка для библиотеки отсутствует во время компиляции?

1 Ответ

5 голосов
/ 04 июля 2011
  1. Межбиблиотечные зависимости могут быть сложны во время выполнения; проверка во время компиляции позволяет компоновщику обнаруживать и иногда разрешать циклы зависимостей и добавлять любые дополнительные зависимости библиотек в список ссылок времени выполнения.
  2. Вы бы предпочли узнать, что вы неправильно написали имя символа во время компиляции / компоновки или во время выполнения? Большинство людей предпочитают первое, поэтому компоновщик проверяет, что все символы разрешены, а не откладывает его на загрузчик времени выполнения; это, конечно, требует присутствия всех библиотек.
  3. Предположим, что для динамической библиотеки требуется наличие статической библиотеки, которая иначе не была бы связана. На большинстве платформ вы не можете (или не можете нормально или безопасно) загружать статические библиотеки во время выполнения, поэтому компоновщик должен иметь дело с этим во время ссылки. (Это на самом деле подслучае № 1.)
...