нужно ли перекомпилировать библиотеки с помощью c++11?
Это очень неосведомленный вопрос, но:
Я хотел бы начать использовать C++11. Могу ли я продолжать использовать мою большую коллекцию библиотек, которые были скомпилированы с моим старым компилятором gcc 4.2.1, или мне нужно перекомпилировать их все с новым компилятором? Я думаю (или надеюсь) ответа нет, но я всего лишь дилетант.
чтобы я мог хотя бы частично избавиться от своего невежества, можете ли вы объяснить, почему в любом случае?
спасибо
5 ответов
Да, вы должны.
более слабая причина - это не бинарная совместимость, проблема заключается в ожиданиях. Компилятор с поддержкой C++11 ожидает, что будет доступен ряд функций (перемещать конструкторы между ними) и использовать их при необходимости. И это только царапает верхушку айсберга, есть несколько других несовместимостей (auto
, 0
и его взаимодействие с указателями, ...).
Это означает, что любой встроенный метод в заголовке может внезапно быть интерпретируется по-разному, в свете стандарта C++11.
более сильная причина заключается в том, что каждая версия компилятора поставляется с собственной стандартной реализацией библиотеки. Вы действительно не хотите начинать смешивать различные версии вокруг и особенно не тогда, когда они претерпели такие серьезные изменения (еще раз, ссылки rvalue...).
поверьте мне, проще перекомпилировать сейчас, чем иметь эту ноющую мысль, что каждая ошибка, которая появляется, может быть из-за несовместимости между старой и новой библиотеки...
Это вопрос компилятора. Например, если у вас есть один компилятор, который поддерживает как C++03
и C++11
в зависимости от переключателя компилятора вы можете, скорее всего, смешивать библиотеки. В C++11 нет ничего нового, что сил несовместимость с C++03.
Howeve, вы упомянули, что ваши библиотеки были скомпилированы с GGC 4.2.1. Поскольку C++11 тогда был просто идеей, вполне вероятно, что GCC тогда был реализован способами, которые оказались несовместим с C++11.
например, std::list::size()
должно быть O(1) в C++11, но это может быть O (N) в C++03. Тогда GCC выбрала реализацию O(N), не зная будущих требований. Текущий GCC std::list::size
реализация совместима как с C++11, так и с++03, так как O(1) лучше, чем O(N).
ответ полностью зависит от API вашей библиотеки и зависимостей ее реализации.
условия, которые гарантируют, что вам не нужно перекомпилировать являются:
-- ваша библиотека не использует специфические функции C++ в своем общедоступном API.
Что означает:
ваша библиотека не предоставляет классы/class-templates/function-templates/другие c++ конкретные вещи.
вы не принимаете / возвращаете C++ классы в / из ваших библиотечных функций.
вы не передаете параметры функции по ссылке.
вы не предоставляете общедоступные встроенные функции с конкретными реализациями C++.
вы не бросаете исключения из своих функций.
вы не (потому что у вас нет причин) включать определенные заголовки библиотеки C++ в ваши общедоступные заголовки. (Это не повредит, если вы включите их, но все должно быть в порядке, если вы удалите такие включает. Это как индикатор.)
-- ваша библиотека зависит только от библиотек, которые двоично совместимы с теми, которые доступны в вашей новой среде сборки.
Если эти условия не удовлетворены, то нет никакой гарантии, что ваша библиотека будет работать правильно. В большинстве случаев гораздо проще перекомпилировать, чем убедиться, что все работает правильно.
в любом случае, если вы собираетесь сделайте бинарный совместимый API, который удовлетворяет приведенным выше условиям, тогда гораздо лучше разработать и реализовать API языка C. Таким образом, Вы автоматически удовлетворяете вышеуказанным условиям и не впадаете в грех написания кода C-style c++.
вы можете использовать большие части C++11 без перекомпиляции (при условии совместимости ABI), но определенная важная часть, по крайней мере для меня, не будет доступна для уже скомпилированной семантики перемещения кода.
семантика перемещения может сделать ваш код быстрее, просто перекомпилировав с компилятором C++11 (и, желательно, c++11 stdlib).
есть и другие причины. Возможно, ваша предпочтительная библиотека стала C++11 известно, так как вы в последний раз скомпилировали его, и теперь больше эффективнее, безопаснее и удобнее использовать при компиляции с компилятором C++11?
для ваших собственных библиотек, с C++11 вы, конечно, можете сделать их более эффективными, безопасными и простыми в использовании? :)
Если ваши интерфейсы к скомпилированному коду используют любой шаблон, который был изменен C++11, то да, вам нужно перекомпилировать. В противном случае вы, вероятно, можете продолжать использовать свои старые библиотеки (если поставщик компилятора также не решил внести изменения в ABI одновременно, потому что это отличная возможность исправить давние ошибки ABI, которые в противном случае часто воздерживаются от исправления из-за двоичной несовместимости).