持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
本文是我之前在微信公众号上的一篇文章记录。原链接为:MySQL++学习笔记:环境搭建
今天主要是将C++的mysql API环境搭建起来,能正常编译,正常读写mysql数据库。
环境
-
系统:Ubuntu18.04
-
数据库:MySQL 5.7.34
-
语言:C++17
-
开源代码:mysql C api: downloads.mysql.com/archives/c-…
mysqlpp: tangentsoft.com/mysqlpp/dir…
目录结构
大概的目录结构如下,中间很多原文件和头文件没有列出来,mysql是官方开源的C接口,mysqlpp是开源的C++Wrapper。
myproj/
├── main.cpp
├── makefile
├── mysql
│ ├── bin
│ │
│ ├── COPYING
│ ├── docs
│ │
│ ├── include
│ │
│ ├── lib
│ │ ├── libmysqlclient.a
│ │ ├── libmysqlclient.so -> libmysqlclient.so.18
│ │ ├── libmysqlclient.so.18 -> libmysqlclient.so.18.4.
│ │ └── libmysqlclient.so.18.4.
│ └── README
└── mysqlpp
├── examples
│
├── src
│
├── ssx
│
└── test
Makefile
makefile文件很简单,就不多说了。
CC ?= gcc
CXX ?= g++
CURPATH := $(shell pwd)
CXXFLAGS :=
CXXFLAGS += -c -std=c++17 -Wall
LDFLAGS :=
LDFLAGS += -L$(CURPATH)/mysql/lib
LIBS :=
LIBS += -lmysqlclient
# 运行时查找链接库目录
ORIGIN := -Wl,-rpath=$(CURPATH)/mysql/lib
INC :=
INC += -I$(CURPATH)/mysql/include
INC += -I$(CURPATH)/mysqlpp/src
target := main.bin
filedir := $(CURPATH)/mysqlpp/src
SRC_C:=$(wildcard $(filedir)/*.c)
SRC_CPP:=$(wildcard $(filedir)/*.cpp)
#SRC_CPP += $(CURPATH)/main.cpp
SRC_CPP += $(CURPATH)/mysqlpp/examples/simple1.cpp
OBJ_C:= ${patsubst %.c, %.o, ${SRC_C}}
OBJ_CPP:= ${patsubst %.cpp, %.o, ${SRC_CPP}}
all: $(target)
$(target): $(OBJ_C) $(OBJ_CPP)
$(CXX) $(OBJ_C) $(OBJ_CPP) $(ORIGIN) $(LDFLAGS) $(LIBS) -o $@
%.o: %.cpp
$(CXX) $(CXXFLAGS) -o $@ -c $< ${INC}
%.o: %.c
$(CC) $(CXXFLAGS) -o $@ -c $< ${INC}
clean:
rm -f $(OBJ_C) $(OBJ_CPP) $(target)
运行
今天的目的是编译以及成功运行一个sample,我们就选mysqlpp中的simple1.cpp来测试。
下面我们来看下simple1的代码:
#include "cmdline.h"
#include "printdata.h"
#include <mysql++.h>
#include <iostream>
#include <iomanip>
using namespace std;
int
main(int argc, char *argv[])
{
// Get database access parameters from command line
mysqlpp::examples::CommandLine cmdline(argc, argv);
if (!cmdline) {
return 1;
}
// Connect to the sample database.
mysqlpp::Connection conn(false);
if (conn.connect(mysqlpp::examples::db_name, cmdline.server(),
cmdline.user(), cmdline.pass())) {
// Retrieve a subset of the sample tb_person table set up by resetdb
// and display it.
mysqlpp::Query query = conn.query("select * from tb_person");
if (mysqlpp::StoreQueryResult res = query.store()) {
cout << "We have:" << endl;
mysqlpp::StoreQueryResult::const_iterator it;
for (it = res.begin(); it != res.end(); ++it) {
mysqlpp::Row row = *it;
cout << '\t' << row[1] << endl;
}
}
else {
cerr << "Failed to get tb_person list: " << query.error() << endl;
return 1;
}
return 0;
}
else {
cerr << "DB connection failed: " << conn.error() << endl;
return 1;
}
}
首先是使用cmdline来解析运行时传入的参数来获取server,user和password,但是运行命令中并没有指定数据库的名称,搜索db_name发现是在cmdline.cpp中直接写的,我当前使用的数据库名是alpha_plus,所以我修改了,如下:
const char* db_name = "alpha_plus";
运行命令如下:
./main.bin -s 127.0.0.1 -u root -p 123456
运行结果:
codemaxi@pc:~/cpp/myproj$ ./main.bin -s 127.0.0.1 -u root -p 123456
We have:
syb
tyy
james
查询成功,确实是数据库中的数据:
好了,今天的文章就到这里了,上面的源码放在gitee上了:gitee.com/codemaxi/my…,有兴趣的可以看看。