нужно ли перекомпилировать библиотеки с c ++ 11? - PullRequest
8 голосов
/ 23 февраля 2012

Это очень неосведомленный вопрос, но:

Я хотел бы начать использовать C ++ 11.Могу ли я продолжать использовать свою большую коллекцию библиотек, которые были скомпилированы с моим старым компилятором gcc 4.2.1, или мне нужно перекомпилировать их все с новым компилятором?Я бы подумал (или надеюсь), что ответ отрицательный, но я всего лишь любитель.

Чтобы я мог удалить хотя бы часть своего невежества, вы можете объяснить, почему в любом случае?

Спасибо

Ответы [ 5 ]

9 голосов
/ 23 февраля 2012

Да, вы должны.

Более слабая причина не в двоичной совместимости, проблема в ожиданиях.Компилятор с поддержкой C ++ 11 будет ожидать наличия ряда функций (перемещать конструкторы среди них) и использовать их при необходимости.И это только царапает верхушку айсберга, есть несколько других несовместимостей (auto, 0 и его взаимодействие с указателями, ...).

Это означает, что любой встроенный метод в заголовке можетв свете стандарта C ++ 11.

Более сильная причина заключается в том, что каждая версия компилятора поставляется со своей собственной реализацией стандартной библиотеки.Вы действительно не хотите начинать смешивать разные версии, особенно когда они претерпели такие серьезные изменения (опять же, ссылки на значения ...).

Поверьте, проще перекомпилировать сейчас, чем иметьворчал, что каждая ошибка может быть связана с несовместимостью старых и новых библиотек ...

3 голосов
/ 23 февраля 2012

Это вопрос компилятора.Например, если у вас есть один компилятор, который поддерживает как C++03, так и C++11 в зависимости от переключателя компилятора, вы, скорее всего, можете смешивать библиотеки.В C ++ 11 нет ничего нового, что вызывает несовместимость с C ++ 03.

Однако, вы упомянули, что ваши библиотеки были скомпилированы с 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, так и с C ++ 03, поскольку O (1) лучше, чем O (N).

3 голосов
/ 23 февраля 2012

Ответ полностью зависит от API вашей библиотеки и зависимостей ее реализации.

Условия, гарантирующие, что вам не нужно перекомпилировать:

- Ваша библиотека не 't использовать специфические функции C ++ в своем общедоступном API.

Это означает:

  1. Ваша библиотека не предоставляет классы / шаблоны классов / функции-шаблоны / другие специфичные для C ++вещи.

  2. Вы не принимаете / не возвращаете классы C ++ в / из ваших библиотечных функций.

  3. Вы не передаете параметры функции посредствомссылка.

  4. Вы не предоставляете общедоступные встроенные функции со специфическими реализациями C ++.

  5. Вы не генерируете исключения из своих функций.

  6. Вы не (потому что у вас нет причин для этого) включать заголовки библиотек C ++ в ваши публичные заголовки.(Если вы включите их, это не помешает, но если вы удалите такие включения, все должно быть в порядке. Это похоже на индикатор.)

- Ваша библиотека зависит только от библиотекдвоично-совместимый с теми, которые доступны в вашей новой среде сборки.

Если эти условия не выполняются, то нет гарантии, что ваша библиотека будет работать правильно.В большинстве случаев гораздо проще перекомпилировать, чем убедиться, что все работает правильно.

В любом случае, если вы собираетесь создавать двоичный совместимый API, который удовлетворяет указанным выше условиям, тогда гораздо лучше спроектировать и реализовать Cязыковой API.Таким образом, вы автоматически выполняете вышеуказанные условия и не впадаете в грех написания кода C ++ в стиле C.

1 голос
/ 23 февраля 2012

Если ваши интерфейсы к скомпилированному коду используют какой-либо шаблон, который был изменен в C ++ 11, то да, вам придется перекомпилировать.В противном случае вы, вероятно, можете продолжать использовать ваши старые библиотеки (если только поставщик компилятора также не решил внести изменения в ABI одновременно, потому что это отличная возможность исправить давние ошибки ABI, которые в противном случае часто воздерживаются от исправления из-за двоичного кода).несовместимость).

1 голос
/ 23 февраля 2012

Вы можете использовать большие части C ++ 11 без перекомпиляции (при условии совместимости ABI), но конкретная важная часть, по крайней мере для меня, не будет доступна для уже скомпилированного кода - семантика перемещения.

Семантика перемещения может ускорить ваш код, просто перекомпилировав его с помощью компилятора C ++ 11 (и, предпочтительно, C ++ 11 stdlib).

Есть и другие причины. Может быть, ваша предпочитаемая библиотека стала осведомленной о C ++ 11 с момента вашей последней компиляции, и теперь стала более эффективной, безопасной или простой в использовании, если она скомпилирована с помощью компилятора C ++ 11?

Для ваших собственных библиотек, с C ++ 11 вы наверняка сможете сделать их более эффективными, безопасными и простыми в использовании? :)

...