MySQL 连接器/C++ 错误访问崩溃

MySQL Connector/C++ BAD ACCESS crash

本文关键字:访问 崩溃 错误 C++ 连接器 MySQL      更新时间:2023-10-16

在Xcode中使用C++,我尝试使用MySQL Connector/C++访问MySQL数据库。问题是程序(用Xcode编译)总是崩溃

EXC_BAD_ACCESS (code=13, address=0x0)

通话时

driver->connect(url, user, pass)

在Xcode中,我创建了一个完整的新项目(OS X>命令行工具),在main.cpp中插入代码(见下文),添加了Boost和MySQL Connector标头包括路径以及libmysqlcppconn.6.1.1.1.dylib作为链接库并点击运行按钮。

接下来的事情是,当我使用

c++ -o test -I /usr/local/mysqlConnector/include/ -lmysqlcppconn main.cpp

程序运行良好,并在表上运行 INSERT 语句。

程序代码取自 MySQL 连接器/C++ 示例,即 pthreads.cpp 示例,但被截断为基本部分:

/* Standard C++ includes */
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <mysql_connection.h>
#include <mysql_driver.h>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
std::string url;
std::string user;
std::string pass;
std::string database;
/**
 * Usage example for Driver, Connection, (simple) Statement, ResultSet
 */
int main(int argc, const char **argv)
{
    sql::Driver *driver;
    std::auto_ptr< sql::Connection > con;
    url = "tcp://127.0.0.1:3306";
    user = "appserver";
    pass = "testpw";
    database = "appserver";
    try {
        driver = sql::mysql::get_driver_instance();
        /* Using the Driver to create a connection */
        con.reset(driver->connect(url, user, pass));
        con->setSchema(database);
    sql::Statement* stmt = con->createStatement();
    stmt->execute("INSERT INTO testtable (testnumber) values (5)");
    } catch (sql::SQLException &e) {
        return EXIT_FAILURE;
    } catch (std::runtime_error &e) {
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

好的,问题解决了。

这里的问题是了一个编译标志。MySQL 连接器/C++ 是在没有
-stdlib=libc++标志,但 Xcode 在其命令中添加了该编译/链接标志。这导致了崩溃。这也解释了为什么手动编译的程序可以工作,因为我没有在编译命令中包含该标志。

为了更清楚:我用-stdlib=libc++标志重新编译了MySQL连接器/C++。然后Xcode编译的程序对我来说很好用。要编译MySQL连接器/C++我添加了

-DMYSQL_CXXFLAGS=-stdlib=libc++

到安装连接器时需要运行的cmake命令。

make VERBOSE=1

然后证明在编译连接器源时实际使用了该标志。

我通过以下方式解决了这个问题:

  1. 下载mysql-connector-c++-8.0.19-winx64
  2. 链接库,包括mysqlcppconn8mysqlcppconn.lib确保连接器的版本正确。 8.0.19为我工作