Сборка 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).
Даже небольшое изменение в версии компилятора может вызвать проблемы. Если вы получаете сообщения об ошибках, которые, как вы подозреваете, связаны с двоичной несовместимостью, соберите 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 за сообщение, что я установил его неправильно и как правильно установить.