Connecting to MySQL in C++
Connecting to MySQL in C++
我正在努力学习c++,我有一点噩梦做测试,我连接到一个MySQL数据库。
我有MySQL连接器没有正确链接的问题,然后得到与relocation truncated to fitr_x86_64_32 against symbol
相关的问题。
我想我已经通过添加编译器标志修复了这一点,现在应用程序成功构建和链接。
当我运行应用程序时,它会调用get_driver_instance,但随后它退出。没有抛出异常,没有错误,只有退出码0。
下面是我的DBManager类#include "DBConnectionManager.h"
using namespace std;
DBConnectionManager::DBConnectionManager() {
cout << "Starting DBConnectionManager - Updated" << endl;
try {
cout << "Getting driver instance" << endl;
driver = get_driver_instance();
cout << "Got driver instance" << endl;
conn = driver->connect("tcp://127.0.0.1:3306", "root", "password");
conn->setSchema("bugs");
cout << "Connected to database" << endl;
}
catch (SQLException ex) {
cout << "Error connecting to DB: " << ex.what() << endl;
}
catch (...) {
cout << "Something has gone wrong" << endl;
}
}
下面是头文件
#ifndef MYSQLTEST_DBCONNECTIONMANAGER_H
#define MYSQLTEST_DBCONNECTIONMANAGER_H
#include <driver.h>
#include <exception.h>
#include <resultset.h>
#include <statement.h>
using namespace sql;
class DBConnectionManager
{
private:
sql::Driver *driver;
sql::Connection *conn;
sql::Statement *statement;
sql::ResultSet *res;
public:
DBConnectionManager();
void performSql();
};
#endif //MYSQLTEST_DBCONNECTIONMANAGER_H
下面是我的主要方法
#include "DBConnectionManager.h"
int main() {
DBConnectionManager dbConnectionManager;
dbConnectionManager.performSql();
return 0;
}
下面是我的CMakeLists.txt文件
cmake_minimum_required(VERSION 3.6)
project(MySQLTest)
include_directories("C:\Program Files\MySQL\MySQL Connector C++ 1.1.7\include\cppconn" "C:\Program Files\MySQL\MySQL Connector C++ 1.1.7\lib\opt")
SET(GCC_COVERAGE_LINK_FLAGS "-m64 -Wl,--image-base -Wl,0x10000000 -lpthread -pthread")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -m64 -Wl,--image-base -Wl,0x10000000 -lpthread -pthread ")
set(SOURCE_FILES main.cpp DBConnectionManager.cpp)
add_executable(MySQLTest ${SOURCE_FILES})
add_library(mysqlcppconn.lib)
set_target_properties(MySQLTest PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(mysqlcppconn.lib PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(MySQLTest "C:\Program Files\MySQL\MySQL Connector C++ 1.1.7\lib\opt\mysqlcppconn.lib")
当我创建我的DBConnectionManager
类的实例时,它成功地调用查询并打印Starting DBConnectionManager - Updated
,然后是Getting Driver Instance
,但随后它与Process finished with exit code 0
一起退出,没有任何线索表明出了什么问题。
我终于有进展了。我发现Cygwin中有一些MySQL客户端库,所以我下载了它们并在cmake文件中引用了它们。
我的cmake文件现在看起来像这样:
cmake_minimum_required(VERSION 3.6)
project(MySQLTest)
SET(CPPCONN_PUBLIC_FUNC=)
SET(GCC_COVERAGE_LINK_FLAGS "-g -m64 -DCPPCONN_PUBLIC_FUNC= -Dmysqlcppconn_EXPORTS -lpthread -pthread -Wl,--image-base -Wl,0x10000000 -lz")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCPPCONN_PUBLIC_FUNC= -Dmysqlcppconn_EXPORTS -std=c++11 -g -m64 -Wl,--image-base -Wl,0x10000000 -lpthread -pthread -lz")
include_directories("C:/mysql_connector/include")
include_directories("C:/boost_1_61_0")
set(BOOST_INCLUDE_DIR C:/boost_1_61_0)
set(BOOST_LIBRARY_DIR C:/boost_1_61_0/libs)
set(SOURCE_FILES main.cpp DBConnectionManager.cpp)
add_executable(MySQLTest ${SOURCE_FILES})
find_package(Boost COMPONENTS REQUIRED)
link_directories(C:/mysql_connector/lib)
target_link_libraries(MySQLTest "C:/mysql_connector/lib/mysqlcppconn.dll" "C:/Program Files/MySQL/MySQL Server 5.7/lib/libmysql.dll" "C:/mysql_connector/lib/libmysqlclient.dll.a" "C:/mysql_connector/lib/libmysqlclient_r.dll.a" ${Boost_LIBRARY_DIR})
注意我是如何链接libmysqlclient.dll.a和libmysqlclient_r.dll的。a这是我从Cygwin那里得到的。
当我现在运行应用程序时,它成功地获得了驱动程序实例,并输出到控制台
Starting DBConnectionManaged - Updated
Getting driver instance
Got driver instance
但是当我尝试连接driver->connect时,我会得到以下错误
0 [main] MySQLTest 2976 C:UsersChris.CLion2016.2systemcmakegeneratedMySQLTest-8702ae138702ae13DebugMySQLTest.exe: *** fatal error - Internal error: TP_NUM_C_BUFS too small: 50
当我把它通过调试器时,它在驱动程序上失败了->连接
gdb: unknown target exception 0xe06d7363 at 0x7fff11347788
Program received signal ?, Unknown signal.
0x00007fff11347788 in RaiseException () from /cygdrive/c/WINDOWS/System32/KERNELBASE.dll
更新2
我读过的所有内容都指出mysql连接器二进制文件应该可以正常工作,所以我重新开始。下面是我的cmake文件
的内容cmake_minimum_required(VERSION 3.6)
project(MySQLTest)
#add_compile_options("-v")
SET(GCC_COVERAGE_LINK_FLAGS )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(BOOST_INCLUDE_DIR C:/boost_1_61_0)
set(BOOST_LIBRARY_DIR C:/boost_1_61_0/libs)
include_directories("C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/include" "C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/include/cppconn" ${BOOST_INCLUDE_DIR})
set(SOURCE_FILES main.cpp DBConnectionManager.cpp)
add_executable(MySQLTest ${SOURCE_FILES})
find_package(Boost COMPONENTS REQUIRED)
link_directories(C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/lib/opt)
target_link_libraries(MySQLTest C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/lib/opt/mysqlcppconn.lib ${Boost_LIBRARY_DIR})
现在当我编译时,我得到了原来的错误
C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/lib/opt/mysqlcppconn.lib(mysqlcppconn.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_get_driver_instance' defined in .idata$5 section in C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/lib/opt/mysqlcppconn.lib(mysqlcppconn.dll.b)
这听起来像我像我的应用程序编译为32位而不是64位。作为测试,我运行了以下代码:
cout << "Int size is: " << sizeof(int) << endl;
上面的代码输出4(如果编译为64位,不应该是8)。
如果我的想法是正确的,为什么不把它编译为64位,我试过设置编译器标志-m64
,但没有区别。我已经安装了Cygwinx64以及CLion正在使用。
您可以使用MySQL连接器c++
下面是如何使用Cmake 进行配置cmake_minimum_required(VERSION 3.7)
project(projectname)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
包括您提取mysql-connector-cpp - download的目录
include_directories(/usr/local/include/mysql-connector-cpp/include)
创建一个包含项目源文件的cmake变量
set(SOURCE_FILES main.cpp)
创建可执行文件
add_executable(projectname ${SOURCE_FILES})
创建可执行文件后的链接
target_link_libraries(projectname mysqlcppconn)
你的CMakeList至少应该有这个或看起来像这个顺序
cmake_minimum_required(VERSION 3.7)
project(projectname)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(/usr/local/include/mysql-connector-cpp/include)
set(SOURCE_FILES main.cpp)
add_executable(projectname ${SOURCE_FILES})
target_link_libraries(projectname mysqlcppconn)
可以使用mysql库从c++连接到mysql。
安装mysql++,
Ubuntu ()
sudo apt-get install mysql-server mysql-client
sudo apt-get install libmysqlclient-dev libmysql++-dev libmysqlcppconn-dev
Mac()
brew install mysql++
通过添加
/usr/include/mysql++
/usr/include/mysql
和添加链接器,
-lmysqlpp -lmysqlclient
示例代码,
#include <iostream>
#include <string>
#include <mysql++.h>
#include <mysql.h>
#define dbname "dbname"
#define server "localhost"
#define user "username"
#define pass "password"
using namespace std;
using namespace mysqlpp;
int main() {
Connection con(true);
try {
con.connect(dbname, server, user, pass);
cout << "Connected to databasen";
string s = "SELECT * FROM mirrors_mee WHERE id=1";
Query q = con.query(s);
StoreQueryResult sq = q.store();
StoreQueryResult::iterator it;
it = sq.begin();
while (it != sq.end()) {
Row row = *it;
cout << row[5] << " " << row[6] << " " << row[7] << endl;
it++;
}
} catch (Exception &e) {
cout << e.what() << endl;
}
return 0;
}
您可以在这里获得库的完整文档
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp