Выбор ответа Senior Сборка и линковка обновлено
Порядок статических библиотек
Вопрос
g++ -L. -lgeometry main.o -o app выдаёт undefined reference на функции из libgeometry.a, а g++ main.o -L. -lgeometry -o app работает. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: ld просматривает архив один раз и берёт объекты только для уже нужных символов. Когда линковщик дошёл до libgeometry.a, неразрешённых символов ещё не было (main.o впереди не встречался), и из архива ничего не взяли.
Варианты ответа
- Флаг
-lработает только в конце командной строки, а в начале игнорируется молча main.oдолжен идти первым, потому что содержит точку входаmain- ld просматривает архив один раз и берёт объекты только для уже нужных символовправильный ответ
- Это ошибка в библиотеке: она собрана без индекса символов
ranlib
Разбор
Когда линковщик дошёл до libgeometry.a, неразрешённых символов ещё не было (main.o впереди не встречался), и из архива ничего не взяли. Потом main.o добавил ссылки, но к архиву ld не возвращается. Правило: библиотеки после тех, кто их использует, а при циклических зависимостях --start-group ... --end-group или повтор библиотеки.
-lразрешён в любом месте, важен относительный порядок.- Наличие
mainни при чём: имеет значение, кто ссылается на символы архива. - Библиотека корректна, ошибка в команде.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.