Сборка MySQL Connector/C++ из исходного кода с помощью cmake завершается неудачно (конфликтует с предыдущим объявлением)

Я пытаюсь скомпилировать MySQL Connector/C++ 8.0.12, используя gcc-8.1.0 и cmake 3.6.2, поскольку пакет apt, похоже, скомпилирован для gcc-4.9 и вылетает при использовании скомпилированных программ gcc-8.1.0 (но работает с скомпилированными программами gcc-4.9).

Из документации MySQL:

Даже небольшое изменение в версии компилятора может вызвать проблемы. Если вы получаете сообщения об ошибках, которые, как вы подозреваете, связаны с двоичной несовместимостью, соберите Connector / C++ из исходного кода, используя тот же компилятор и компоновщик, который вы используете для сборки и компоновки своего приложения.

Когда я пытаюсь собрать разъем из источника, как описано здесь:

git clone https://github.com/mysql/mysql-connector-cpp.git
mkdir cppconn
cd cppconn

cmake /home/pi/mysql-connector-cpp
 # Everything looks fine except for:
Protobuf include path: /home/pi/mysql-connector-cpp/cdk/protobuf/protobuf-2.6.1/src
...
-- Performing Test HAVE_IS_SAME - Failed

cmake --build . --target install --config Debug
 # All lot of warings come up and then:
Scanning dependencies of target protobuf
...
[ 34%] Building CXX object CMakeFiles/protobuf.dir/protobuf-2.6.1/src/google/protobuf/text_format.cc.o
In file included from /home/pi/mysql-connector-cpp/cdk/protobuf/protobuf-2.6.1/src/google/protobuf/text_format.cc:37:
/usr/bin/gcc-8.1.0/include/c++/8.1.0/math.h:65:12: error: ‘constexpr bool std::isinf(double)’ conflicts with a previous declaration
 using std::isinf;
            ^~~~~
In file included from /usr/include/features.h:374,
                 from /usr/bin/gcc-8.1.0/include/c++/8.1.0/arm-linux-gnueabihf/bits/os_defines.h:39,
                 from /usr/bin/gcc-8.1.0/include/c++/8.1.0/arm-linux-gnueabihf/bits/c++config.h:508,
                 from /usr/bin/gcc-8.1.0/include/c++/8.1.0/utility:68,
                 from /usr/bin/gcc-8.1.0/include/c++/8.1.0/algorithm:60,
                 from /home/pi/mysql-connector-cpp/cdk/protobuf/protobuf-2.6.1/src/google/protobuf/text_format.cc:35:
/usr/include/arm-linux-gnueabihf/bits/mathcalls.h:201:1: note: previous declaration ‘int isinf(double)’
 __MATHDECL_1 (int,isinf,, (_Mdouble_ __value)) __attribute__ ((__const__));
 ^~~~~~~~~~~~
In file included from /home/pi/mysql-connector-cpp/cdk/protobuf/protobuf-2.6.1/src/google/protobuf/text_format.cc:37:
/usr/bin/gcc-8.1.0/include/c++/8.1.0/math.h:66:12: error: ‘constexpr bool std::isnan(double)’ conflicts with a previous declaration
 using std::isnan;
            ^~~~~
In file included from /usr/include/features.h:374,
                 from /usr/bin/gcc-8.1.0/include/c++/8.1.0/arm-linux-gnueabihf/bits/os_defines.h:39,
                 from /usr/bin/gcc-8.1.0/include/c++/8.1.0/arm-linux-gnueabihf/bits/c++config.h:508,
                 from /usr/bin/gcc-8.1.0/include/c++/8.1.0/utility:68,
                 from /usr/bin/gcc-8.1.0/include/c++/8.1.0/algorithm:60,
                 from /home/pi/mysql-connector-cpp/cdk/protobuf/protobuf-2.6.1/src/google/protobuf/text_format.cc:35:
/usr/include/arm-linux-gnueabihf/bits/mathcalls.h:234:1: note: previous declaration ‘int isnan(double)’
 __MATHDECL_1 (int,isnan,, (_Mdouble_ __value)) __attribute__ ((__const__));

Требования, изложенные в документации:

  • Компилятор C++, который поддерживает C++11. В случае gcc это должна быть как минимум версия 4.8. Эти компиляторы были протестированы: gcc 4.8.5, 5.4.0, 6.3.0, 6.3.1, 7.2.1, 7.3.0, 8.1.1, clang 9.0.0, MS Visual Studio 2015. (присутствует ~ 8.1. 0)
  • CMake 2.8.12 или более поздняя версия. (настоящее время - 3.6.2)
  • Повысьте уровень 1.59 или выше, если используемая версия стандартной библиотеки C++ не поддерживает преобразователь UTF8 (codecvt_utf8). Повышение также требуется при сборке устаревшего соединителя (см. Ниже). (насколько мне известно, libstdC++.so.6.0.25 поддерживает codecvt_utf8)
  • OpenSSL версии 1.0.x, если соединитель построен с использованием OpenSSL. Вместо OpenSSL Connector / C++ может быть собран с использованием WolfSSL 3.14.0 или новее. (настоящее время - 1.0.1)
  • Клиентская библиотека MySQL 8.0 при сборке устаревшего соединителя (см. Ниже). (не обязательно)

Дополнительная информация:

  • используя Raspberry Pi 2b под управлением Raspbian
  • libstdC++ версия 6.0.25
  • Версия Protobuf, кажется, 2.6.1 (будет сборкой)

Заранее спасибо. -Minding

1 ответ

Решение

Решением было правильно установить gcc с помощью этой команды:

cp -a gcc-*version*/bin/. /usr/bin/
cp -a gcc-*version*/lib/. /usr/lib/
 # ... (for all sub directories)

Который просто копирует все файлы из исходной папки в папку назначения.

Спасибо @Matthieu Brucher за сообщение, что я установил его неправильно и как правильно установить.

Другие вопросы по тегам