Подключение к MySQL в С++

Я пытаюсь изучить С++, и у меня есть немного кошмара, выполняющего тест, где я подключаюсь к базе данных MySQL.

У меня возникли проблемы с соединителем MySQL, не связанным правильно, тогда возникали проблемы, связанные с relocation truncated to fitr_x86_64_32 against symbol.

Я думаю, что исправил это, добавив флаг компилятора, и теперь приложение успешно создает и связывает.

Когда я запускаю приложение, он доходит до вызова get_driver_instance, но затем он выходит. Никакое исключение не выбрасывается, ошибок нет, просто выйдите из кода 0.

Ниже мой класс DBManager

#include "DBConnectionManager.h"

using namespace std;

DBConnectionManager::DBConnectionManager() {
    cout << "Starting DBConnectionManager - Updated" << endl;
    try {
        cout << "Getting driver instance" << endl;
        driver = get_driver_instance();
        cout << "Got driver instance" << endl;
        conn = driver->connect("tcp://127.0.0.1:3306", "root", "password");
        conn->setSchema("bugs");
        cout << "Connected to database" << endl;
    }
    catch (SQLException ex) {
        cout << "Error connecting to DB: " << ex.what() << endl;
    }
    catch (...) {
        cout << "Something has gone wrong" << endl;
    }
}

Ниже приведен заголовочный файл

#ifndef MYSQLTEST_DBCONNECTIONMANAGER_H
#define MYSQLTEST_DBCONNECTIONMANAGER_H
#include <driver.h>
#include <exception.h>
#include <resultset.h>
#include <statement.h>

using namespace sql;

class DBConnectionManager
{
private:
    sql::Driver *driver;
    sql::Connection *conn;
    sql::Statement *statement;
    sql::ResultSet *res;
public:
    DBConnectionManager();
    void performSql();
};
#endif //MYSQLTEST_DBCONNECTIONMANAGER_H

Ниже мой основной метод

#include "DBConnectionManager.h"

int main() {
    DBConnectionManager dbConnectionManager;
    dbConnectionManager.performSql();
    return 0;
}

Ниже представлен мой файл CMakeLists.txt

cmake_minimum_required(VERSION 3.6)
project(MySQLTest)

include_directories("C:\\Program Files\\MySQL\\MySQL Connector C++ 1.1.7\\include\\cppconn" "C:\\Program Files\\MySQL\\MySQL Connector C++ 1.1.7\\lib\\opt")

SET(GCC_COVERAGE_LINK_FLAGS    "-m64 -Wl,--image-base -Wl,0x10000000 -lpthread -pthread")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -m64 -Wl,--image-base -Wl,0x10000000 -lpthread -pthread ")

set(SOURCE_FILES main.cpp DBConnectionManager.cpp)
add_executable(MySQLTest ${SOURCE_FILES})
add_library(mysqlcppconn.lib)

set_target_properties(MySQLTest PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(mysqlcppconn.lib PROPERTIES LINKER_LANGUAGE CXX)

target_link_libraries(MySQLTest "C:\\Program Files\\MySQL\\MySQL Connector C++ 1.1.7\\lib\\opt\\mysqlcppconn.lib")

Когда я создаю экземпляр класса DBConnectionManager, он успешно вызывает запрос и печатает Starting DBConnectionManager - Updated, за которым следует Getting Driver Instance, но затем он выходит с Process finished with exit code 0 без каких-либо подсказок относительно того, что пошло не так.

Спасибо за любую помощь, которую вы можете предоставить.

UPDATE

Я наконец-то попадаюсь. Я обнаружил, что в Cygwin есть несколько клиентских библиотек mysql, поэтому я загружаю их и ссылаюсь на них в файле cmake.

Мой файл cmake теперь выглядит следующим образом:

cmake_minimum_required(VERSION 3.6)
project(MySQLTest)

SET(CPPCONN_PUBLIC_FUNC=)

SET(GCC_COVERAGE_LINK_FLAGS    "-g -m64 -DCPPCONN_PUBLIC_FUNC= -Dmysqlcppconn_EXPORTS -lpthread -pthread -Wl,--image-base -Wl,0x10000000  -lz")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCPPCONN_PUBLIC_FUNC= -Dmysqlcppconn_EXPORTS -std=c++11 -g -m64 -Wl,--image-base -Wl,0x10000000  -lpthread -pthread  -lz")

include_directories("C:/mysql_connector/include")
include_directories("C:/boost_1_61_0")

set(BOOST_INCLUDE_DIR C:/boost_1_61_0)
set(BOOST_LIBRARY_DIR C:/boost_1_61_0/libs)
set(SOURCE_FILES main.cpp DBConnectionManager.cpp)

add_executable(MySQLTest ${SOURCE_FILES})

find_package(Boost COMPONENTS REQUIRED)

link_directories(C:/mysql_connector/lib)

target_link_libraries(MySQLTest "C:/mysql_connector/lib/mysqlcppconn.dll"  "C:/Program Files/MySQL/MySQL Server 5.7/lib/libmysql.dll" "C:/mysql_connector/lib/libmysqlclient.dll.a" "C:/mysql_connector/lib/libmysqlclient_r.dll.a" ${Boost_LIBRARY_DIR})

Обратите внимание, как я связал библиотеки libmysqlclient.dll.a и libmysqlclient_r.dll.a, что я получил от Cygwin.

Когда я запускаю приложение, теперь он успешно получает экземпляр драйвера и выводит консоль

Starting DBConnectionManaged - Updated
Getting driver instance
Got driver instance

Но когда я пытаюсь подключиться к driver- > connect, я получаю следующую ошибку

0 [main] MySQLTest 2976 C:\Users\Chris\.CLion2016.2\system\cmake\generated\MySQLTest-8702ae13\8702ae13\Debug\MySQLTest.exe: *** fatal error - Internal error: TP_NUM_C_BUFS too small: 50

Когда я передал его через отладчик, он не работает с драйвером- > connect с

gdb: unknown target exception 0xe06d7363 at 0x7fff11347788

Program received signal ?, Unknown signal.
0x00007fff11347788 in RaiseException () from /cygdrive/c/WINDOWS/System32/KERNELBASE.dll

ОБНОВЛЕНИЕ 2 Все, что я прочитал, указывает, что двоичные файлы-соединители mysql должны работать нормально, поэтому я снова начал. Ниже приведено содержимое моего файла cmake

cmake_minimum_required(VERSION 3.6)
project(MySQLTest)


#add_compile_options("-v")

SET(GCC_COVERAGE_LINK_FLAGS )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(BOOST_INCLUDE_DIR C:/boost_1_61_0)
set(BOOST_LIBRARY_DIR C:/boost_1_61_0/libs)

include_directories("C:/Program\ Files/MySQL/MySQL\ Connector\ C++\ 1.1.7/include" "C:/Program\ Files/MySQL/MySQL\ Connector\ C++\ 1.1.7/include/cppconn" ${BOOST_INCLUDE_DIR})


set(SOURCE_FILES main.cpp DBConnectionManager.cpp)

add_executable(MySQLTest ${SOURCE_FILES})

find_package(Boost COMPONENTS REQUIRED)

link_directories(C:/Program\ Files/MySQL/MySQL\ Connector\ C++\ 1.1.7/lib/opt)

target_link_libraries(MySQLTest C:/Program\ Files/MySQL/MySQL\ Connector\ C++\ 1.1.7/lib/opt/mysqlcppconn.lib ${Boost_LIBRARY_DIR})

Теперь, когда я компилирую, я получаю исходную ошибку

C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/lib/opt/mysqlcppconn.lib(mysqlcppconn.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_get_driver_instance' defined in .idata$5 section in C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/lib/opt/mysqlcppconn.lib(mysqlcppconn.dll.b)

Мне кажется, что мое приложение компилируется как 32-битное, а не 64-битное. В качестве теста я выполнил следующий код:

cout << "Int size is: " << sizeof(int) << endl;

Приведенный выше код выводит 4 (не должен быть 8, если он был скомпилирован как 64 бит).

Если мое мышление верное, почему он не компилирует его как 64-битный, я попытался установить флаг компилятора -m64, но не имеет никакого значения. Я также установил Cygwinx64, который использует CLION.

Ответы

Ответ 1

Вы можете использовать MySQL Connector С++

Вот как настроить с помощью Cmake

cmake_minimum_required(VERSION 3.7)

project(projectname)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

Включите dirs, где вы извлекли mysql-connector-cpp - download

include_directories(/usr/local/include/mysql-connector-cpp/include)

Создайте переменную cmake, содержащую исходные файлы проекта

set(SOURCE_FILES main.cpp)

Создайте свой исполняемый файл

add_executable(projectname ${SOURCE_FILES})

Ссылка после создания исполняемого файла

target_link_libraries(projectname mysqlcppconn)

Ваш CMakeList должен по крайней мере иметь это или выглядеть так в этом порядке

cmake_minimum_required(VERSION 3.7)
project(projectname)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(/usr/local/include/mysql-connector-cpp/include)
set(SOURCE_FILES main.cpp)
add_executable(projectname ${SOURCE_FILES})
target_link_libraries(projectname mysqlcppconn)

Ответ 2

Вы можете использовать библиотеку mysql ++ для подключения к mysql из С++.
Для этого установите mysql ++,
(Ubuntu)

sudo apt-get install mysql-server mysql-client
sudo apt-get install libmysqlclient-dev libmysql++-dev libmysqlcppconn-dev

(Mac)

brew install mysql++

включить библиотеку, добавив,

/usr/include/mysql++
/usr/include/mysql

и добавьте компоновщики,

-lmysqlpp -lmysqlclient

Пример кода,

#include <iostream>
#include <string>
#include <mysql++.h>
#include <mysql.h>

#define dbname "dbname"
#define server "localhost"
#define user "username"
#define pass "password"

using namespace std;
using namespace mysqlpp;

int main() {
    Connection con(true);
    try {
        con.connect(dbname, server, user, pass);
        cout << "Connected to database\n";
        string s = "SELECT * FROM mirrors_mee WHERE id=1";
        Query q = con.query(s);
        StoreQueryResult sq = q.store();
        StoreQueryResult::iterator it;
        it = sq.begin();
        while (it != sq.end()) {
            Row row = *it;
            cout << row[5] << " " << row[6] << " " << row[7] << endl;
            it++;
        }
    } catch (Exception &e) {
        cout << e.what() << endl;
    }
    return 0;
}

Вы получите полную документацию библиотеки здесь.