Как я могу скомпилировать с другой версией G ++ в проекте C ++ Autotools - PullRequest
0 голосов
/ 25 декабря 2018

У меня большой проект autotools, и одна часть кодов в подкаталоге использует g ++ - 4.9 для компиляции, другие используют g ++ 8.2.

У меня вопрос, как скомпилировать весь проект с другой версиейg ++.

Я вижу связанный с этим вопрос о том, чтобы изменить другой компилятор g ++, и общие ответы - установить переменные окружения или опции make.

Однако моя проблема заключается вскомпилировать одновременно с g ++ 8.2 и g ++ 4.9.

Я ожидаю, что есть несколько решений для установки Makefile.am , например:

noinst_PROGRAMS=foo bar
foo_CXX_COMPILER=/usr/bin/g++-4.9

bar_CXX_COMPILER=/usr/bin/g++-8.2

РЕДАКТИРОВАТЬ:

Подробности, которые я пробовал :

  1. Сторонняя библиотека в подпроекте будет отображать много предупреждений "auto_ptr не рекомендуется "при компиляции с g++-4.9 -std=c++11, но без каких-либо ошибок и хорошего выполнения.
  2. Он хорошо скомпилирован без ошибок и предупреждений с g++-4.9 -std=c++98.
  3. Он выдает много ошибок "неопределенная ссылка на ..." при компиляции с g++-8.2, даже если я добавляюflag -std=c++98.

Я полагаю, это потому, что компилятор g++-8.2 не может распознать использование auto_ptr!

Я предпочитаю использовать только один компилятор, который решает проблему просто!Но если в этом случае нельзя разрешить использовать только один, я бы хотел узнать, как настроить Makefile.am с двумя разными компиляторами, или каким-либо лучшим способом решить эту проблему компиляции!

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

У меня большой проект 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был действительно отличается от своих предшественников).

0 голосов
/ 26 декабря 2018

У меня вопрос, как скомпилировать весь проект с другой версией g ++.

Возможно, но я бы не советовал.Система сборки GNU не поддерживает этого, но вы можете посмотреть, как AX_CC_FOR_BUILD реализует аналогичную идею (включив компилятор как для хоста, так и для хоста).

* 1008Идея №2 - это то, что предложил @JohnBollinger - выберите компилятор и соберите его.Конечные пользователи вашей сборки оценят это больше, чем необходимость установки двух компиляторов.Это решение, с которым я бы согласился, поскольку система сборки GNU работает именно так.g ++ - 8.2 можно сказать скомпилировать код из предыдущих версий C ++, если старый код по какой-то причине не может быть модернизирован.

Идея № 3 состоит в том, чтобы разделить ваш проект на два проекта autotools - один компилирующийсо старым компилятором и один с новым компилятором.Не слишком фанат этой идеи.

...