Выбор ответа Senior Сборка и линковка обновлено

Порядок статических библиотек

Вопрос

g++ -L. -lgeometry main.o -o app выдаёт undefined reference на функции из libgeometry.a, а g++ main.o -L. -lgeometry -o app работает. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: ld просматривает архив один раз и берёт объекты только для уже нужных символов. Когда линковщик дошёл до libgeometry.a, неразрешённых символов ещё не было (main.o впереди не встречался), и из архива ничего не взяли.

Варианты ответа

  1. Флаг -l работает только в конце командной строки, а в начале игнорируется молча
  2. main.o должен идти первым, потому что содержит точку входа main
  3. ld просматривает архив один раз и берёт объекты только для уже нужных символовправильный ответ
  4. Это ошибка в библиотеке: она собрана без индекса символов ranlib

Разбор

Когда линковщик дошёл до libgeometry.a, неразрешённых символов ещё не было (main.o впереди не встречался), и из архива ничего не взяли. Потом main.o добавил ссылки, но к архиву ld не возвращается. Правило: библиотеки после тех, кто их использует, а при циклических зависимостях --start-group ... --end-group или повтор библиотеки.

  • -l разрешён в любом месте, важен относительный порядок.
  • Наличие main ни при чём: имеет значение, кто ссылается на символы архива.
  • Библиотека корректна, ошибка в команде.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.