How to connect to Mysql using C++ in Mac OSX

Hello Guys,

Today i was struggling while Connecting to MySQL in C++ in OSX and i did lot of research but there was no help available out there then i had to dug out the solution myself and decided to share the solution with everyone who is struggling with the same situation to connect the mysql in c++ in OSX.

There were some errors i was getting while connecting are:

 

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

You can check the demo GitHub repo i have created there https://github.com/khanakia/mysql-connector-cpp-macos

There are two ways to connect using mysql.h file or using mysql connector. You can use any of the method mentioned below

Method 1 — Using Mysql.h

You can check the example here demo1.cpp file which is using mysql.h.

By Default g++ uses clang compiler which comes with Xcode which is not a genuine compiler so you need to reinstall to have genuine compiler for g++ You can check version with g++ — version

Here are the steps:

You will have to install the macports and mysql using below the commands

// 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

Now you create a new file demo1.cpp and paste this code or you can check the github repo link i shared

/* 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);
}

Now Compile and run the file using the below command

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

Method 2 — Using Mysql Connector CPP

First you will have to download the connector for osx using these steps

  1. Download Mysql C++ Connector for Mac OS from here https://dev.mysql.com/downloads/connector/cpp/
  2. Extract cppconn direcotry and mysql_connection.h, mysql_driver.h, mysql_error.h file to the root direcotry of your application

Now create DYLIB file from cpp connector using the same compiler we are using to compile our code

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

NOTE: You should find dylib files in driver director and copy those files to the same directory where your code exists

Now you create a new file demo.cpp and paste this code or you can check the github repo link i shared

/* 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;
}

Now Compile and run the file using the below command

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

If you found my article useful please do not forget to share and like it. Thanks guys.

Our practice is built around your needs

Let us take the weight of product development off your shoulders and boost your digital presence.
×