Сбой MySQL Connector / C ++ BAD ACCESS

Используя C ++ в Xcode, я пытаюсь получить доступ к базе данных MySQL с помощью MySQL Connector / C ++. Проблема в том, что программа (скомпилированная с 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 как Link Библиотека и нажмите кнопку Run.

Следующее, когда я собираю программу вручную, используя

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

программа работает нормально, а также выполняет оператор INSERT для таблицы.

Код программы взят из примеров MySQL Connector / 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;
}

4

Решение

Ок, проблема решена.

Здесь проблема была в одном флаге компиляции. MySQL Connector / C ++ был скомпилирован без
-stdlib=libc++ flag, но XCode добавил этот флаг compile / link к своим командам. Это вызвало аварию. Это также объясняет, почему скомпилированная вручную программа работала, поскольку я не включил этот флаг в команду компиляции.

Чтобы сделать это более ясным: я перекомпилировал MySQL, Connector / C ++ с -stdlib=libc++ флаг. Тогда программа, скомпилированная Xcode, прекрасно работает для меня. Для компиляции MySQL Connector / C ++ я добавил

-DMYSQL_CXXFLAGS=-stdlib=libc++

к cmake команда, которую нужно выполнить при установке разъема.

make VERBOSE=1

Затем доказано, что флаг на самом деле используется при компиляции исходного кода коннекторов.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]