GreatSQL社区

搜索

DB架构师:曾凡坤

MYSQL C++链接接口编程

DB架构师:曾凡坤 已有 96 次阅读2025-1-6 10:09 |个人分类:MYSQL|系统分类:运维实战| MySQL

使用MYSQL 提供的C++接口来访问数据库,官网比较零碎,又不想全部精读一下,百度CSDN都是乱七八糟的,大部分不可用

官网教程地址https://dev.mysql.com/doc/connector-cpp/1.1/en/connector-cpp-examples-connecting.html


网上之所以乱七八糟,主要是MYSQL提供了3个接口两个包,使用两种语言交叉编程. 可以用GCC编辑C语言调用C++接口. 可以用C++语言调用C接口.

分别是C 接口, C++接口 MYSQLX接口. 三个接口两个包.

C包和C++包, C++包(Connector/C++)里面从官网下载,

而C包从MYSQL服务端包里抠出来.

C++包里面包含JDBC接口和MYSQLX, 怎么JDBC不是JAVA的应用接口吗?不知道为什么用这4个字母! 今天我们得用JDBC目录下的C++接口

C接口文件 libmysqlclient.so, libmysqlclient.a 分静态和动态.从服务端解压LIB获得, 头文件从INCLUDE获得.

编辑

另外 开发包可以通过YUM来安装

yum install –y libmysqlclient-dev
yum install –y libmysqlcppconn-dev
sudo rpm -ivh mysql-connector-c++-devel-8.0.20-1.el7.x86_64.rpm --nodeps --force
sudo rpm -ivh mysql-connector-c++-8.0.20-1.el7.x86_64.rpm --nodeps --force
sudo rpm -ivh mysql-connector-c++-jdbc-8.0.20-1.el7.x86_64.rpm --nodeps --force

编辑

从官网下载

https://downloads.mysql.com/archives/community/

编辑

之所以选择8.0.11 是基于 CENTOS7 环境. C++要求比较多 最烦的是OPENSSL的版本,还有GLIBC版本,以及BOOST版本, 太高了还对GCC版本有要求. 升级GCC版本 还得涉及CMAKE,MAKE版本涉及. 这就太扯了,我就是为了这点多巴胺快乐.要我付出那么多痛苦. 这时跟PYTHON没啥区别. 还不如用GO简单!

查看系统对应GLIBC 版本

<code >[root@dsmart=>lib]$ldd --version
ldd (GNU libc) 2.17Copyright (C) 2012 Free Software Foundation, Inc.This is free software; see the source for copying conditions. 
 There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.Written by Roland McGrath and Ulrich Drepper.

<strong>查看系统对应的OPENSSL  版本</strong>

<code >[shark@sharkdb=>DelBigTable]$openssl version 
-aOpenSSL 1.0.1e-fips 11 Feb 2013built on: Tue Jun 17 17:23:54 UTC 2014
platform: linux-x86_64options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) 
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASMOPENSSLDIR: "/etc/pki/tls"engines:  rdrand dynamic

<strong>安装BOOST开发库</strong>

<code >[root@sharkdb test_connect_mysql8]# yum install boost-devel
已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfile * 
base: linux.mirrors.es.net 
* extras: centos-distro.1gservers.com 
* updates: opencolo.mm.fcix.net
正在解决依赖关系--> 正在检查事务---> 软件包 boost-devel.x86_64.0.1.53.0-28.el7 将被 安装--> 解决依赖关系完成

<strong>YUM 安装开发库</strong>

yum install –y libmysqlclient-dev  #C语言接口
yum install –y libmysqlcppconn-dev #C++语言接口

一般会安装在这两个目录下

/usr/local/mysql/include
/usr/local/mysql/lib

还需要向公共目录安装软链接

  • ln -s /usr/local/mysql/libmysqlclient.so.18 /usr/lib/libmyqlclient.so
    

    目录不一定正确 可能是

  • /usr/lib64/mysql/lib...  ==&gt;/usr/sbin/lib/....

    <br>

    <strong>头文件</strong>

    安装在系统目录下 使用尖挂号&lt;&gt;

    C语言头文件

  • #include 
    #include 

    <br>

    因为我们通过从官网下载C++链接接口,所以不YUM 安装了

    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 

    进行解压 tar –zxvf

    <br>

    解压后进入两到三级目录查看

    可以看到2个子目录 分别是C++接口和分布式接口

    库目录有3个库文件,加密库LIBCRYPTO.SO,链接库LIBMYSQLCPPONN.SOLIBSSL.SO库,静态链接库libmysqlcppconn-static.a

    另外个MYSQLCPPONN8 忘记干啥子用的.没关系反正不使用它


    MYSQL C++接口应用 基础需要3个动态链接库就行了

    <strong>把 INCLUDE 和LIB放入项目目录下</strong>

  • cp  -r include/  /home/Project/CPP_MYSQL
    Cp –r  lib64/ /home/Project/CPP_MYSQL

    用VIM 编辑我们的代码,这里我们用双引号

    #include 
    #include"include/jdbc/mysql_connection.h"
    #include"include/jdbc/mysql_driver.h"
    #include"include/jdbc/cppconn/driver.h"
    #include"include/jdbc/cppconn/resultset.h"
    #include"include/jdbc/cppconn/statement.h"
    usingnamespacestd;
    usingnamespace sql;
    
    intmain()
    {
       try
       {
           // 创建MySQL连接
            Driver* driver = get_driver_instance();
            Connection* con = driver-&gt;connect("tcp://192.168.0.62:3306", "manjo_lts", "tR9zWedofe@soeeJf");
            // 连接到test数据库
            con-&gt;setSchema("lts");
           // 执行一条查询语句
            Statement* stmt = con-&gt;createStatement();
            ResultSet* res = stmt-&gt;executeQuery("SELECT * FROM lts_cron_job_queue");
            while (res-&gt;next()) 
            {
              cout &lt;getString("job_id") &lt;&lt; endl;
            }
            // 清理连接资源
            delete res;
            delete stmt;
            delete con;
        } catch (SQLException& e) 
        {
            cout &lt;&lt; "SQLException: " &lt;&lt; e.getErrorCode() &lt;&lt; " " &lt;&lt; e.what() &lt;&lt; endl;
        }
        return0;
    }          // 内存分配失败 

    <strong>编译命令</strong>

    [root@sharkdb test_connect_mysql8]# cat makeDebug 
    rm -f nohup.out
    nohup g++ -g main.cpp -std=c++11 -I ./include  -L./lib64  -lmysqlcppconn  -lssl -lcrypto  -Wl,-rpath,'lib64' -o main.exe

    编译命令解释:

    -g 带调试信息
    -std=c++11  使用C++11标准 或者高版本std=c++17
    -I 大写i 表示头文件从当前目录找
    -L 动态链接库目录
    -l  哪个动态链接库的文件名, 要掐头取尾  mysqlcppconn  ssl crypto
    -Wl,-rpath,'lib64' 表示 运行过程中动态库优先搜索目录  本地子目录lib64
    -o main.exe 输出可执行文件

    <br>

    重点就是 WL,-RPATH 运行时候先从程序所在的目录下找动态库

    运行OK

    [root@sharkdb test_connect_mysql8]# 
    ./main.exe 
    E3786A77EE4745719884FB6145701571
    D61AE3215C1A432CA0406ED5DFCDDA68
    D00A13194BD545C2BC3FEFA889BAFD02
    D3FEC2C5E7994FFEADE2B4DBBC89EA8D
    04C49E96CE034E61A6D53AC3EF6B6DE6
    99ADE95D5F914A69AEAE7DC0B9B30344
    C8F136D2F5BF4CA6AB6C244AB62DC351
    C56A7CAC73AF48D4B7269D1A6082F1F6
    F8C6D0E5E07642DD90F749E331C771FA
    E4D2B686E92844A0BA3B8A3609605109
    C3F7233062E447B08748E5A470BA1938

    <strong>测试平台移植</strong>

    <strong>编译只带</strong>

     g++ -g main.cpp -std=c++11 -I ./include  -L./lib64  -lmysqlcppconn -Wl,-rpath,'lib64' -o main.exe

    运行报丢失两个动态库


    
    [root@dsmart=&gt;CPP_MYSQL]$./main2.exe 
    ./main2.exe:
     error while loading shared libraries: libssl.so.1.0.0:
     cannot open shared object file: No such file or directory
     
     [root@dsmart=&gt;CPP_MYSQL]$./main2.exe
      ./main2.exe
     : error while loading shared libraries: libcrypto.so.1.0.0: 
     cannot open shared object file: No such file or directory
    

    把两个移到LIB64目录下. 注意软链接不生效

    发表评论 评论 (1 个评论)

    回复 DB架构师:曾凡坤 2025-1-6 10:17
        编辑多次还是那么多乱码

    facelist

    您需要登录后才可以评论 登录 | 立即注册

    合作电话:010-64087828

    社区邮箱:greatsql@greatdb.com

    社区公众号
    社区小助手
    QQ群
    GMT+8, 2025-2-5 14:09 , Processed in 0.016756 second(s), 11 queries , Redis On.
    返回顶部