Как подключиться к Mysql с помощью C++ в Mac OSX

Привет ребята,

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

Были некоторые ошибки, которые я получал при подключении:

ERROR libc++abi.dylib: terminating with uncaught exception of type sql::SQLException  Abort trap: 6

Вы можете проверить демо-репозиторий GitHub, который я создал там https://github.com/khanakia/mysql-connector-cpp-macos

Существует два способа подключения с помощью файла mysql.h или с помощью коннектора mysql. Вы можете использовать любой из методов, указанных ниже.

Способ 1 — Использование Mysql.h

Вы можете проверить пример файла demo1.cpp, который использует mysql.h.

По умолчанию g++ использует компилятор clang, который поставляется с Xcode, который не является подлинным компилятором, поэтому вам необходимо переустановить его, чтобы получить подлинный компилятор для g++. Вы можете проверить версию с помощью g++ — версия

Вот шаги:

Вам нужно будет установить macports и mysql, используя приведенные ниже команды.

// Install macports using brew
sudo port selfupdate
sudo port install gcc46
sudo port select --set gcc mp-gcc46
gcc --version  // It should Say (gcc (MacPorts gcc46 4.6.4_11) 4.6.4) ...
// Installing and running mysql
brew install mysql

Теперь вы создаете новый файл demo1.cpp и вставляете этот код, или вы можете проверить ссылку на репозиторий github, которой я поделился

/* Standard C++ includes */
#include <stdlib.h>
#include <iostream>
#include <mysql.h>
using namespace std;
int main(void)
{
  // std::vector<std::string> tables;
  MYSQL_RES *result;
  MYSQL_ROW row;
  MYSQL *connection, mysql;
  
  int state;
  
  mysql_init(&mysql);
  
  connection = mysql_real_connect(&mysql,"127.0.0.1","root","root","mysql",0,0,0);
  
  // cout << connection;
  if (connection == NULL)
  {
    std::cout << mysql_error(&mysql) << std::endl;
    // return tables;
  }
state = mysql_query(connection, "SHOW TABLES");
  if (state !=0)
  {
    std::cout << mysql_error(connection) << std::endl;
  }
  
  result = mysql_store_result(connection);
  
  std::cout << "tables: " << mysql_num_rows(result) << std::endl;
  while ( ( row=mysql_fetch_row(result)) != NULL )
  {
    cout << row[0] << std::endl;
  }
  
  mysql_free_result(result);
  mysql_close(connection);
}

Теперь скомпилируйте и запустите файл, используя приведенную ниже команду.

g++ -o demo1 -I/usr/local/include -I/usr/local/include/mysql -W -lmysqlclient -L/usr/local/lib demo1.cpp 
./demo1

Способ 2 — Использование Mysql Connector CPP

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

  1. Загрузите Mysql C++ Connector для Mac OS отсюда https://dev.mysql.com/downloads/connector/cpp/
  2. Извлеките каталог cppconn и файлы mysql_connection.h, mysql_driver.h, mysql_error.h в корневой каталог вашего приложения.

Теперь создайте файл DYLIB из коннектора cpp, используя тот же компилятор, который мы используем для компиляции нашего кода.

git clone https://github.com/mysql/mysql-connector-cpp .
git checkout 1.1
git tag
git checkout tags/1.1.9
which g++
which gcc
cmake -DCMAKE_C_COMPILER=/opt/local/bin/gcc -DCMAKE_CXX_COMPILER=/opt/local/bin/g++ .
make
make install

ПРИМЕЧАНИЕ. Вы должны найти файлы dylib в директории драйверов и скопировать эти файлы в тот же каталог, где находится ваш код.

Теперь вы создаете новый файл demo.cpp и вставляете этот код, или вы можете проверить ссылку на репозиторий github, которой я поделился

/* Standard C++ includes */
#include <stdlib.h>
#include <iostream>
/*
  Include directly the different
  headers from cppconn/ and mysql_driver.h + mysql_util.h
  (and mysql_connection.h). This will reduce your build time!
*/
#include "mysql_connection.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
using namespace std;
int main(void)
{
cout << endl;
sql::Driver *driver;
  sql::Connection *con;
  sql::Statement *stmt;
  sql::ResultSet *res;
/* 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("mysql");
stmt = con->createStatement();
  res = stmt->executeQuery("SELECT 'Hello World!' AS _message");
  while (res->next()) {
    cout << "\t... MySQL replies: ";
    /* Access column data by alias or column name */
    cout << res->getString("_message") << endl;
    cout << "\t... MySQL says it again: ";
    /* Access column data by numeric offset, 1 is the first column */
    cout << res->getString(1) << endl;
  }
  delete res;
  delete stmt;
  delete con;
cout << endl;
return EXIT_SUCCESS;
}

Теперь скомпилируйте и запустите файл, используя приведенную ниже команду.

g++ -o demo -I/usr/local/include -I/Volumes/D/www/c++ -L. -lmysqlcppconn demo.cpp
./demo

Если вы нашли мою статью полезной, пожалуйста, не забудьте поделиться ею и поставить лайк. Спасибо, парни.