【问题标题】:MySQL C++ Connector: undefined reference to `get_driver_instance'MySQL C++ 连接器:未定义对“get_driver_instance”的引用
【发布时间】:2011-04-21 19:19:47
【问题描述】:

我一直在尝试让 MySQL 连接器工作我已经安装了连接器和 mysql 客户端库,但我仍然收到此错误:

obj/Database.obj: In function `Database::connect()':
/home/xeross/alpine/src/server/Database.cpp:13: undefined reference to `get_driver_instance'
collect2: ld returned 1 exit status
make[2]: *** [alpine-server] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

使用 Ubuntu 10.04 而我的makefile如下:

INCLUDES = -I./src -I./src/shared
OUTDIR = bin
INTDIR = obj
OPTIONS = -ggdb -g3 -Wall -O0

alpine-server : Shared.a AsyncServerSocket.obj PlayerHandler.obj PacketHandler.obj     Session.obj User.obj Database.obj init
    g++ $(INCLUDES) $(OPTIONS) -static \
    -pthread \
    -lmysqlcppconn-static \
            -o $(OUTDIR)/alpine-server src/server/main.cpp \
        $(INTDIR)/AsyncServerSocket.obj \
        $(INTDIR)/PacketHandler.obj \
        $(INTDIR)/Database.obj \
        $(INTDIR)/PlayerHandler.obj \
        $(INTDIR)/Session.obj \
        $(INTDIR)/User.obj \
        $(INTDIR)/Shared.a \
        -lboost_system \
        -lmysqlclient


AsyncServerSocket.obj : src/server/AsyncServerSocket.cpp init
g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/AsyncServerSocket.obj src/server/AsyncServerSocket.cpp

PlayerHandler.obj : src/server/PlayerHandler.cpp init
g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/PlayerHandler.obj src/server/PlayerHandler.cpp

PacketHandler.obj : src/server/PacketHandler.cpp init
g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/PacketHandler.obj src/server/PacketHandler.cpp

Session.obj : src/server/Session.cpp init
    g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/Session.obj src/server/Session.cpp

User.obj : src/server/User.cpp init
    g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/User.obj src/server/User.cpp

Database.obj : src/server/Database.cpp init
    g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/Database.obj src/server/Database.cpp

# Shared.a
Shared.a : Packet.obj Flags.obj AsyncSocket.obj Log.obj init
    ar -cvq $(INTDIR)/Shared.a \
        $(INTDIR)/Packet.obj \
        $(INTDIR)/Flags.obj \
        $(INTDIR)/AsyncSocket.obj \
        $(INTDIR)/Log.obj
    ranlib $(INTDIR)/Shared.a

Packet.obj : src/shared/packet.cpp init
    g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/Packet.obj src/shared/packet.cpp

Flags.obj : src/shared/Flags.cpp init
    g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/Flags.obj src/shared/Flags.cpp

AsyncSocket.obj : src/shared/AsyncSocket.cpp init
g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/AsyncSocket.obj src/shared/AsyncSocket.cpp

Log.obj : src/shared/Log.cpp init
    g++ -c $(INCLUDES) $(OPTIONS) -o $(INTDIR)/Log.obj src/shared/Log.cpp

init:
    mkdir -p bin obj

clean:
    rm -f $(INTDIR)/*.obj $(INTDIR)/*.a

代码

// Excerpt from .hpp file
#include <cppconn/driver.h>
#include <cppconn/connection.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
// End excerpt

void Database::connect()
{
    std::stringstream connString;
    connString << "tcp://";
    connString << m_host;
    connString << ":";
    connString << m_port;

    m_driver = get_driver_instance(); // This guy is being a *****
    m_conn = m_driver->connect(connString.str(), m_user, m_password);
    m_conn->setSchema(m_database);
}

我能做些什么来解决这个问题?

【问题讨论】:

  • 这个问题简直是噩梦,两天以来我一直在苦苦挣扎,无法解决。

标签: c++ mysql makefile mysql-connector


【解决方案1】:

该代码将比 make 文件更有帮助,但请尝试将 using namespace sql; 添加到 Database.cpp 的顶部。

// Excerpt from .hpp file
#include <cppconn/driver.h>
#include <cppconn/connection.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

using namespace sql;     // <---- add here

【讨论】:

  • src/server/Database.hpp:13: error: 'mysql' is not a namespace-name, will put up code in a bit
  • 我说的是“顶部”,但它需要低于包含。
【解决方案2】:

您需要添加-lmysqlcppconn-static使用该库中内容的目标文件。

【讨论】:

  • 在特定 .obj 的编译中或在最终编译的 lib 列表的底部?
  • 尝试将它添加到主编译和对象(-static 和 -lmysqlcppconn-static)
【解决方案3】:

非常感谢,我也解决了。我有确切的经验。

我在 64 位 CentOS 上使用 Eclipse CDT,任何阅读本文的人都可以按照以下步骤操作。

  1. 首先,确保代码中包含以下内容。

include "mysql_driver.h"

include "mysql_connection.h"

using namespace sql::mysql;

  1. 确保在 Eclipse 中您已在 Eclipse 项目设置中指定。 包括 mysql/includemysql/include/cppconn 目录,然后是库目录中的 mysql/lib,然后更重要的是指定 -lmysqlcppconn

  2. 确保您在 Eclipse 编译器选项中也设置了 -m64。

  3. 当您运行程序时,它可能会抱怨缺少 libmysqlcppconn.so.1 。这样做,将libmysqlcppconn.so.1.0.5 复制到您的/usr/lib64 目录中。在该目录中创建一个指向libmysqlcppconn.so.1.0.5libmysqlcppconn.so.1 链接。

您的程序现在应该可以运行了。

【讨论】:

    【解决方案4】:

    我终于可以在 Ubuntu 10.10 中成功编译出带有 C++ 连接器的程序了。

    最初我遇到了与“未定义对 `get_driver_instance' 的引用”相同的问题,为了解决这个问题,我声明了 MySQL_Driver 类型的驱动程序实例变量。为了便于参考,此类型在 mysql_driver.h 文件中定义。这是我在程序中使用的代码 sn-p。

    sql::mysql::MySQL_Driver *driver;
    try {     
        driver = sql::mysql::get_driver_instance();
    }
    

    我使用 -l mysqlcppconn 链接器选项编译了程序

    【讨论】:

      【解决方案5】:

      你需要链接

      -lmysqlcppconn -lmysqlcppconn-static
      

      第一个库包含 /usr/include/cppconn/ 中头文件的代码,第二个库包含头文件 mysql_driver.hmysql_connection.h

      【讨论】:

        【解决方案6】:

        对我来说需要-lmysqlclient

        g++ -o mariaS2json test.cpp -L/usr/lib/ -lmysqlcppconn -lmysqlclient
        

        现在一切正常

        【讨论】:

          猜你喜欢
          • 2011-11-22
          • 2013-04-06
          • 2011-03-27
          • 2019-04-02
          • 1970-01-01
          • 2019-01-22
          • 1970-01-01
          • 2018-01-01
          • 1970-01-01
          相关资源
          最近更新 更多