在C+中连接到MySQL+; 我正在学习C++,我做了一个噩梦,我在那里连接了一个MySQL数据库。p>

在C+中连接到MySQL+; 我正在学习C++,我做了一个噩梦,我在那里连接了一个MySQL数据库。p>,c++,mysql,c++11,clion,C++,Mysql,C++11,Clion,我遇到了MySQL连接器链接不正确的问题,然后遇到了与重定位相关的问题,针对符号将其截断为fitr_x86_64_32 我想我已经通过添加编译器标志修复了这个问题,现在应用程序成功地构建和链接了 当我运行该应用程序时,它甚至会调用get_driver_实例,但随后退出。没有引发异常,没有错误什么都没有只是退出代码0 下面是我的DBManager类 #include "DBConnectionManager.h" using namespace std; DBConnectionManager

我遇到了MySQL连接器链接不正确的问题,然后遇到了与
重定位相关的问题,针对符号将其截断为fitr_x86_64_32

我想我已经通过添加编译器标志修复了这个问题,现在应用程序成功地构建和链接了

当我运行该应用程序时,它甚至会调用get_driver_实例,但随后退出。没有引发异常,没有错误什么都没有只是退出代码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;
    }
}
下面是我的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
类的实例时,它成功地调用查询并打印
启动DBConnectionManager-Updated
,然后
获取驱动程序实例
,但随后它退出
过程,退出代码为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:\Users\Chris\.CLion2016.2\system\cmake\generated\MySQLTest-8702ae13\8702ae13\Debug\MySQLTest.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;

<代码> CUT> P>可以使用MySQL +库从C++连接到MySQL。 要安装mysql++,
Ubuntu

Mac

通过添加

/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 database\n";
        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;
}
#包括
#包括
#包括
#包括
#定义dbname“dbname”
#定义服务器“localhost”
#定义用户“用户名”
#定义密码
使用名称空间std;
使用名称空间mysqlpp;
int main(){
连接con(真);
试一试{
con.connect(数据库名、服务器、用户、密码);
你可以用

这是如何使用Cmake进行配置

cmake_minimum_required(VERSION 3.7)

project(projectname)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
包括您提取mysql连接器cpp的目录-

创建包含项目源文件的cmake变量

创建可执行文件

创建可执行文件后的链接

您的CMakeList至少应该有这个或在这个顺序中看起来像这个
我知道退出代码0意味着没有错误,虽然情况显然不是这样,但我已经更新了我的问题,以包括main.cpp一个奇怪的部分是,如果程序崩溃,它不应该有一个0的退出代码。如上所述,您可能应该在
conn=driver->connect(“tcp://127.0.0.1:3306“,”根“,“password”);
当我浏览它时,IDE说它在
get\u driver\u实例
调用中收到了一个分段错误,不知道为什么它没有这样说,虽然当你正常运行它,但也看不出它为什么会分段错误,它匹配了我在Google上看到的几个例子:(谢谢提示@qix这是针对Mac和Linux的,我不使用Mac,但已经说过我已经让它在Linux上运行了没有问题。问题出在Windows上,我也尝试过这个库,但它似乎不起作用,现在不记得为什么了。如果你不记得为什么,你可能应该再试一次。
/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 database\n";
        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;
}
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)
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)