4

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コネクタヘッダーインクルードパスとlibmysqlcppconn.6.1.1.1.dylibをリンクとして追加しましたライブラリを作成し、[実行]ボタンをクリックします。

次のことは、私が手動でプログラムをコンパイルするときです

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

1 に答える 1

8

わかりました、問題は解決しました。

ここでの問題は、1 つのコンパイル フラグでした。MySQL Connector/C++ は
-stdlib=libc++フラグなしでコンパイルされましたが、Xcode はそのコンパイル/リンク フラグをコマンドに追加しました。これがクラッシュの原因でした。これは、コンパイルコマンドにそのフラグを含めなかったため、手動でコンパイルされたプログラムが機能した理由も説明しています。

より明確にするために、MySQL Connector/C++ を-stdlib=libc++フラグ付きで再コンパイルしました。その後、Xcode でコンパイルされたプログラムは問題なく動作します。追加した MySQL Connector/C++ をコンパイルするには

-DMYSQL_CXXFLAGS=-stdlib=libc++

cmakeコネクタのインストール時に実行する必要があるコマンドに。

make VERBOSE=1

次に、コネクタのソースをコンパイルするときにフラグが実際に使用されることを証明しました。

于 2013-01-28T23:46:13.357 に答える