Я пишу о проблеме, которая возникла у меня при установке MySQL Connector C++. Я использую бинарный дистрибутив соединителя для Linux (Ubuntu 18.04), поэтому я поместил каталог библиотеки вне своего проекта (это один из примеров, приведенных в справочном руководстве здесь (https://dev.mysql.com/doc/connector-cpp/1.1/en/connector-cpp-installation-binary.html).
В моем проекте (Clion) у меня есть этот файл cmake:
cmake_minimum_required(VERSION 3.14)
project(MySQLConnectorTest)
set(CMAKE_CXX_STANDARD 14)
link_directories(../mysql-connector-c++/lib64)
link_directories(/opt/lampp/lib)
add_executable(MySQLConnectorTest main.cpp)
include_directories(../mysql-connector-c++/include/jdbc)
target_link_libraries(MySQLConnectorTest mysqlclient.a)
target_link_libraries(MySQLConnectorTest mysqlcppconn-static.a)
Установка mySQL, которая у меня есть, предоставляется с XAMPP. Итак, каталог, где найти mysqlclient.a
, это /opt/lampp/lib
Проблема в том, что при связывании mysqlcppconn-static.a
во время компиляции я получаю длинный список ошибок, например:
/home/riccardo/MySQLConnectorTest/../mysql-connector-c++/lib64/libmysqlcppconn-static.a(libmysqlclient_client.cc.o):
nella funzione "ssl_verify_server_cert(Vio*, char const*, char const**) [clone .isra.7]":
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3283: riferimento non definito a "SSL_get_peer_certificate"
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3288: riferimento non definito a "SSL_get_verify_result"
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3359: riferimento non definito a "X509_free"
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3302: riferimento non definito a "X509_check_host"
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3304: riferimento non definito a "X509_check_ip_asc"
Может кто-нибудь объяснить мне, что это значит? Может ли кто-нибудь предложить мне, как исправить?
Заранее спасибо.
[EDIT]: следуя приведенному здесь предложению, компиляция теперь проходит нормально. Я думаю, что есть еще одна проблема, программа-пример выдает исключение при вызове метода подключения:
/* Create a connection */
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
/* Connect to the MySQL test database */
con->setSchema("test");
Я нашел другие сообщения по этой проблеме, например С++ соединение mysql bad_alloc с использованием коннектора С++. но это не помогает в Linux, в частности, я пытался следовать подсказке:
I had the same error on linux. The error was : I was using g++-4.8 to build the project The issue lies on the version of the build tools (gcc,msvs,clang) used to build the project by trying to update g++, but I have tha latest version. Probably is more difficult to make this library work than writing the code I need for my application, I hope someone can suggest me what to try next.
Спасибо
Спасибо за комментарий, попытался добавить следующие строки: target_link_libraries(MySQLConnectorTest ssl.so) target_link_libraries(MySQLConnectorTest crypto.so) Но в выводе ничего не меняется
Поскольку это mysqlcppconn-static.a
библиотека, которая требует пропущенных символов, ssl
и crypto
библиотеки должны быть добавлены после это: target_link_libraries(MySQLConnectorTest mysqlcppconn-static.a ssl crypto)
О, хорошо, кажется, это начинает работать, но теперь у меня есть эта ошибка: /usr/bin/ld: /home/riccardo/MySQLConnectorTest/../mysql-connector-c++/lib64/libmysqlcppconn-static.a( libmysqlclient_client_plugin.cc.o): неопределенная ссылка на символ 'dlclose@@GLIBC_2.2.5' //lib/x86_64-linux-gnu/libdl.so.2: ошибка при добавлении символов: DSO отсутствует в командной строке Попытка добавить "dl" в конец, но это приводит к большому количеству ошибок для pthread.
Так что вам тоже нужно связать с библиотекой dl
. Просто Google для пропущенных символов, и вы найдете, с какой библиотекой вам нужно связать.
Спасибо за помощь, компиляция идет нормально, добавлены dl и pthread. Теперь у меня есть ошибки при выполнении. Я следую этому stackoverflow.com/questions/16605623/…. Один из отсутствующих символов - GLIBCXX_3.4.20, но я нашел его в своей системе.
Кажется, я решил простым способом. Пишу сюда что пробовал и какие ошибки получил. Я снова прочитал руководство разработчика и мне кажется, что при использовании предоставленных двоичных файлов могут возникнуть проблемы из-за разных компиляторов, используемых для библиотеки и для проекта. Затем я попытался скомпилировать исходники, чтобы убедиться, что компилятор, используемый для библиотеки и для моего проекта, один и тот же. Я следовал этому руководству: https://aaronxu17.github.io/blog/install-mysql-connector/
Это не сработало, скомпилированная библиотека была названа mysqlcppconn8-static.a вместо mysqlcppconn-static.a, но, изменив ссылку на имя, у меня возникла такая ошибка компиляции:
reference not defined to get_driver_instance
Наконец я нашел этот https://stackoverrun.com/it/q/4344116 и решил просто с помощью
sudo apt-get install libmysqlcppconn-dev
Теперь все, что пробовали, кажется глупым на фоне окончательного решения. Я надеюсь, что это может сэкономить время другим людям. Спасибо
Это означает, что вам нужно также связать библиотеки, которые предоставляют пропущенные символы: ssl и крипто.