Mac下Xcode通过MySQL Connector/C++ 8.0连接MySQL详细环境搭建历程

问题描述

为了使mac下Xcode建立的c++项目能操作mysql数据库,找遍了国内国外各种教程,踩坑无数,终于摸索出了环境搭建的方法。

心得是,官方文档永远是最好的教程:

5.1 Building Connector/C++ Applications: General Considerations

5.2.2 macOS Notes

当然其它各类博客、Stack Overflow上的帖子也或多或少提供了些线索,但无一例外都是不全面的!

摸索了整整半天,吐血探索出来的完整环境搭建步骤整理如下。

如果不在意原理,只想按步骤搭环境,可以直接看最后的总结

环境需求

参考官方文档,配置环境有以下需求:
Build Tools and Configuration Settings

  1. C++11 Support:编译器需开启-std=c++11选项
  2. Connector/C++ Header Files:头文件搜索路径需包含ConnectorC++安装路径/include
  3. Boost Header Files:在Unix系统中,需要Boost 1.59.0版以上的库, 头文集搜索路径需包含boost所在位置(实际上没有也行)
  4. Link Libraries:使用OpenSSL编译时需要引用OpenSSL动态库
  5. Runtime Libraries:如果使用了动态库编译,需要在工程中和可执行文件处均放置Connector/C++、OpenSSL等运行时库
  6. Using the Connector/C++ Dynamic Library:使用动态库时,用到libmysqlcppconn8.A.dylib (macOS),A代表版本名
  7. Using the Connector/C++ Static Library:使用静态库时,用到libmysqlcppconn8-static.a (Unix, macOS)

第6步,使用动态库的Makefile文件如下:

MYSQL_CONCPP_DIR = Connector/C++ installation location
CPPFLAGS = -I $(MYSQL_CONCPP_DIR)/include -L $(MYSQL_CONCPP_DIR)/lib64
LDLIBS = -lmysqlcppconn8
CXXFLAGS = -std=c++11
app : app.cc

对应的编译指令是:

g++ -std=c++11 -I .../include -L .../lib64 app.cc -lmysqlcppconn8 -o app

第7步,使用静态的Makefile文件如下:

MYSQL_CONCPP_DIR = Connector/C++ installation location
CPPFLAGS = -DSTATIC_CONCPP -I $(MYSQL_CONCPP_DIR)/include
LDLIBS = $(MYSQL_CONCPP_DIR)/lib64/libmysqlcppconn8-static.a -lssl -lcrypto -lpthread
CXXFLAGS = -std=c++11
app : app.cc

对应的编译指令是:

g++ -std=c++11 -DSTATIC_CONCPP -I .../include app.cc
  .../lib64/libmysqlcppconn8-static.a -lssl -lcrypto -lpthread -o app

安装MySQL Connector/C++

到官网下载:下载地址
在这里插入图片描述
直接下载dmg文件安装,默认会安装到/usr/local/mysql-connector-c++-8.0.20
在这里插入图片描述
同时也有两个链接文件夹,都可视作同一个。

在Xcode中创建MySQL项目

创建一个命令行项目,名为,main.cpp里写入下面测试代码:

#include <mysql.h>
#include <iostream>
using namespace std;

//把下面配置信息修改为自己数据库的
const char host[] = "localhost";
const char user[] = "root";
const char pwd[] = "123456";
const char database[] = "staff";
unsigned int port = 3306;

int main()
{
    MYSQL myCont;
    mysql_init(&myCont);
    if (mysql_real_connect(&myCont, host, user, pwd, database, port, NULL, 0)){
        cout << "Hello MySQL!" << endl;
    }
    else
    {
        cout << "connect failed!" << endl;
    }
    mysql_close(&myCont);
    return 0;
}

现在什么库都没有配置,当然会报很多错误,下面要做的是把错误一个个解决掉。

逐步解决报错

‘mysql.h’ file not found

这个头文件路径是在mysql安装文件夹里,默认位置:/usr/local/mysql/include

在项目配置中Header Search Paths中加入该路径:
在这里插入图片描述
重新编译,'mysql.h' file not found已经消失。

Undefined symbol: _mysql_init

下面遇到了三个未定义符合的错误:

Undefined symbol: _mysql_close
Undefined symbol: _mysql_init
Undefined symbol: _mysql_real_connect

Library Search Paths中添加/usr/local/mysql-connector-c++/lib64

Other Linker Flags中添加-lmysqlcppconn-static

重新编译,很开心地看到,错误已经发生变化并增加到了100个…
在这里插入图片描述

Undefined symbol: _BIO_free

这些错误其实都是缺少SSL库引起的,这些库其实已经在/usr/local/mysql-connector-c++/lib64中有了,只需在Other Linker Flags中添加-lssl-lcrypto

重新编译后,开心地发现,编译已经能通过了。

只不过还会报错:dyld: Library not loaded: libssl.1.1.dylib

dyld: Library not loaded: libssl.1.1.dylib

程序编译通过,仍无法运行,错误详情如下:

dyld: Library not loaded: libssl.1.1.dylib
  Referenced from: /Users/xxx/Library/Developer/Xcode/DerivedData/mysqlcpp-eifmjimmumeleagsnsupxghuyjfd/Build/Products/Debug/mysqlcpp
  Reason: image not found

这是由于未能找到动态链接库引起的,哪个路径报错(Referenced from后面的),就把库文件放到哪就完事了。

打开finder-go-go to folder,输入/Users/xxx/Library/Developer/Xcode/DerivedData/mysqlcpp-eifmjimmumeleagsnsupxghuyjfd/Build/Products/Debug/mysqlcpp,回车,到达相应位置;

或者直接在工程中products文件夹下右键-show in finder即可:
在这里插入图片描述
/usr/local/mysql-connector-c++/lib64中的libcrypto.1.1.dyliblibssl.1.1.dylib复制过去就行了:
在这里插入图片描述

重新运行,即可运行成功:
在这里插入图片描述

总结

首先下载安装mysql-connector-c++-8.0.20-macos10.15-x86-64bit.dmg

然后在Xcode工程具体配置步骤是:

  1. Header Search Paths中加入/usr/local/mysql/include
  2. Library Search Paths中添加/usr/local/mysql-connector-c++/lib64
  3. Other Linker Flags中添加-lmysqlcppconn-static-lssl-lcrypto
  4. /usr/local/mysql-connector-c++/lib64中的libcrypto.1.1.dyliblibssl.1.1.dylib复制到可执行程序所在文件夹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章