• linux环境下写C++操作mysql(二)


    main.cpp

    #include<stdio.h>
    #include<stdlib.h>
    #include"mysqlInterface.h"
    
    
    int main()
    {
        CMysqlInterface mysqlObj;
        mysqlObj.connect();
        return 0;
    }

    mysqlInterface.h

    class CMysqlInterface
    {
        public:
            CMysqlInterface();
            ~CMysqlInterface();
            int connect();
        private:
            MYSQL* mysqlPtr;
    };

    mysqlInterface.cpp

    #include"mysqlInterface.h"
    
    CMysqlInterface::CMysqlInterface()
    {
        printf("CMysqlInterface
    ");
        mysqlPtr = NULL;
        mysqlPtr = mysql_init(NULL);
        if(!mysqlPtr)
        {
            printf("mysql_init failed
    ");
        }
    }
    
    CMysqlInterface::~CMysqlInterface()
    {
        mysql_close(mysqlPtr);
        mysqlPtr = NULL;
    }
    
    int CMysqlInterface::connect()
    {
        int iRet = -1;
        mysql_real_connect(mysqlPtr,"localhost","root","csql","child",0,NULL,0);
        if(!mysqlPtr)
        {
            printf("connect failed
    ");
        }
        else
        {
            printf("connect success
    ");
            iRet = 0;
        }
        return iRet;
    }

    Makefile:

    Makefile文件
    test : main.o mysqlInterface.o
        g++ main.o mysqlInterface.o -o test -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient
    
    main.o:main.cpp
        g++ -c main.cpp  -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient
    mysqlInterface.o : mysqlInterface.cpp 
        g++ -c mysqlInterface.cpp  -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient
    
    .PHONY:clean
    clean:
        rm -f main.o mysqlInterface.o  test

    执行结果:

    make

    g++ -c main.cpp  -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient

    g++ -c mysqlInterface.cpp  -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient

    g++ main.o mysqlInterface.o -o test -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient

    ./test

    CMysqlInterface

    connect success

    程序运行成功

    Makefile升级版:

    src = $(wildcard ./*cpp)
    obj = $(patsubst %.cpp , %.o , $(src))
    target = test
    CC = g++
    
    $(target) : $(obj)
        $(CC) $(obj) -o $(target) -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient
    
    %.o: %.cpp
        $(CC) -c $< -o $@ -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient
    
    .PHONY:clean
    clean:
        rm -f $(obj)$(target)
    
    

    文件解释:

    src = $(wildcard ./*cpp)

    扩展通配符:搜索指定文件。

    这句话代表的意思是再当前目录下搜索所有的 .cpp文件并赋值给变量 src。函数执行结束后,src的值就是 main.cp 和 mysqlInterface.cpp 

    obj = $(patsubst %.cpp , %.o , $(src))

    patsubst,替换通配符,按照指定规则做替换。

    此行代码的意思的是将src里的每个.cpp文件 都替换成 .o文件赋值给 obj变量。

    这句话还可以替换成obj = $(src: %.c = %.o) //也是将src里的每个文件都是.c替换.o

    Makefile再升级:

    src = $(wildcard ./*cpp)
    obj = $(patsubst %.cpp , %.o , $(src))
    
    target = test
    CC = g++
    
    $(target) : $(obj)
            $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS)  $(obj) -o $(target)  -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient 
    
    %o: %.cpp
        $(CC) $(CFLAGS) -c $< -o $@ -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient
    
    .PHONY:clean
    clean:
        rm -f $(target)  $(obj)

    遇到的bug:

    obj = $(patsubst %.cpp , %.o , $(src))

    %.cpp,%.o不能有空格

    如果有空格,那obj的值还是.cpp文件,不会转化为.o文件

    %o: %.cpp

    如果%.o少了,会报mysql.h找不到的错误
    In file included from main.cpp:3:0:

    mysqlInterface.h:2:18: fatal error: mysql.h: 没有那个文件或目录

     #include"mysql.h"

                      ^

    compilation terminated.

    成功版本:

    CFLAGS := -g
    target := test
    INCLUDE =  -I /usr/include/mysql
    lib = -lmysqlclient 
    dirlib = -L /usr/lib/mysql/ 
    
    src = $(wildcard *.cpp)
    objs = $(patsubst %.cpp,%.o,$(src))
    
    all: $(target)
    
    %.o: %.cpp
            #g++ $(CFLAGS)   $(INCLUDE) $(lib) $(dirlib) -c $< -o $@ 
            g++ $(CFLAGS)   $(INCLUDE) $(lib) $(dirlib) -c $< -o $@ 
    
    $(target) : $(objs)
            g++ $(CFLAGS)  $(objs) $(dirlib) $(lib) -o $(target)  $(INCLUDE)
    
    .PHONY:clean
    clean:
        rm -f $(target)  $(obj)

    如果make的文件名是Makefile或makefile,直接执行make

    如果是别的,比如Makefile1,就可以执行make -f Makefile1

    执行结果:

    exbot@ubuntu:~/wangqinghe/MySql/20190621/01/01$ make -f Makefile1

    #g++ -g   -I /usr/include/mysql -lmysqlclient  -L /usr/lib/mysql/  -c main.cpp -o main.o

    g++ -g   -I /usr/include/mysql -lmysqlclient  -L /usr/lib/mysql/  -c main.cpp -o main.o

    #g++ -g   -I /usr/include/mysql -lmysqlclient  -L /usr/lib/mysql/  -c mysqlInterface.cpp -o mysqlInterface.o

    g++ -g   -I /usr/include/mysql -lmysqlclient  -L /usr/lib/mysql/  -c mysqlInterface.cpp -o mysqlInterface.o

    g++ -g  main.o mysqlInterface.o -L /usr/lib/mysql/  -lmysqlclient  -o test  -I /usr/include/mysql

    程序运行结果;

    exbot@ubuntu:~/wangqinghe/MySql/20190621/01/01$ ./test
    CMysqlInterface
    connect success

  • 相关阅读:
    数据结构3 特殊二叉树
    数据结构2 树与二叉树
    数据结构1 线性结构
    《数据库系统概念》20-恢复系统
    《数据库系统概念》19-并发控制
    数据库系统概念》18-事务
    巨杉内核笔记 | 会话(Session)
    巨杉Tech|SequoiaDB 巨杉数据库高可用容灾测试
    巨杉学习笔记 | SequoiaDB MySQL导入导出工具使用实战
    保险行业持续扩展,巨杉数据库再次中标人保财险
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11067013.html
Copyright © 2020-2023  润新知