Как стать автором
Обновить

Комментарии 12

Серёжа, спасибо!
Обратитесь в поддержку IBM :))

Им и при хороших временах было пофигу. А сейчас и подавно.

Мне интересно мнение читателя по поводу вопроса.

По сути тут реализован приоритет символов. С ld можно такое же поведение получить

Как inline функция оказалась в экспорте? Может оптимизация отключена настолько, что inline не раскрываются?

Не проводил широких экспериментов с оптимизацией. Пример с inline функцией был выбран для упрощения. Если вместо нее в foo и boo создавать объект типа std::string, то тоже будет наблюдаться включение "ненужного" модуля. Линкер в первом модуле *BNDDIR увидит инстанцированный конструктор std::basic_string и включит этот модуль в программу, хотя это инстанцирование уже есть в модуле BOO$.

Это важно. Если оптимизация отключена, то для облегчения отладки компилятор не раскрывает inline - тогда можно встать дебаггером внутрь inline функции. Поскольку inline определен в хедере, то компилятор фактически создаёт обычную, не inline, функцию внутри модуля, в котором используется эта функция. Внутри какого модуля - зависит от реализации компилятора и порядка обхода модулей во время компиляции.

Если бы inline раскрылся, то символа вообще не создалось бы, ни в импорте, ни в экспорте.

Внутри какого модуля - зависит от реализации компилятора и порядка обхода модулей во время компиляции.

В моем примере модули скомпилированы отдельно друг от друга, а не в одной команде. Поэтому функция zoo есть в каждом, это нормально.

По любому, не имеет большого смысла предъявлять претензии к недостаточной оптимизации сборки, если оптимизация отключена.

Проблема-то не в оптимизации. Нет ни малейшего смысла линковать лишние модули даже при отключенной оптимизации.

Проверьте

Да фиг с ним с экспортом, как она оказалась в импорте?

Вот да, поддерживаю вопрос.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории