У меня большой проект autotools, и одна часть кодов в подкаталоге использует g ++ - 4.9 для компиляции, другие используют g ++ 8.2.
У меня вопрос, как скомпилировать весь проектс другой версией g ++.
Я не рекомендую делать это. ABI условные обозначения могли измениться (поэтому IMHO компиляция с двумя разными GCC разных ABI не рекомендуется).
На самом деле, я рекомендую собирать все проекты с одним и тем же (самым новым) GCC,то есть с g++
8.2
Если в некоторых частях проекта используется другой диалект C ++, вы можете явно передать им некоторые опции -std=c++11
или -std=c++17
.
Такпросто настройте свой проект на использование того же (и самого последнего) GCC.Если некоторые диалекты C ++ отличаются, передайте ему определенный флаг.Посмотрите опции, управляющие диалектом C ++ и -std=
опция .
Наконец, вы можете рассмотреть исправление исходного кода старой библиотеки, чтобы сделать ее C ++14 (в частности, удаляйте все вхождения auto_ptr
и заменяйте их с умом unique_ptr
и т. Д.).В большинстве случаев стоит сделать это (и, возможно, более новая версия этой старой библиотеки уже существует, а именно C ++ 14 или C ++ 17)
Смешивание двух разных версий Стандартная библиотека C ++ , безусловно, болезненна, и ее следует избегать.Если вы настаиваете на том, чтобы попробовать это, вам нужно болезненно понимать все кровавые детали (поэтому я действительно рекомендую не пытаться это делать).Затем прочитайте Drepper'а Как писать разделяемые библиотеки paper.
Другой подход может заключаться в том, чтобы ваше программное обеспечение использовало два разных процесса (один длястарый исходный код C ++ 98, еще один для нового кода C ++ 14) и использование средств межпроцессного взаимодействия .Это, пожалуй, самое надежное решение.
Для практических целей рассмотрите старый C ++ 98 и новый C ++ 14 как два разных и несовместимых языка программирования (C ++ 11был действительно отличается от своих предшественников).