MySQL C++ 连接器:`get_driver_instance` 未定义引用

6

我一直在尝试使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);
}

我该怎么做才能解决这个问题?

这个问题真是噩梦,我已经挣扎了两天,还是无法解决它。 - Shravan40
6个回答

8

最终我成功地在Ubuntu 10.10中使用C++连接器编译了一个程序。

一开始,我遇到了与“undefined reference to `get_driver_instance'”相同的问题。为了解决这个问题,我声明了我的驱动程序实例变量为MySQL_Driver类型。为了方便参考,该类型在mysql_driver.h文件中定义。以下是我在程序中使用的代码片段。

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

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


4
非常感谢,我已经修复了。我的经历与你一模一样。
我正在64位CentOS上使用Eclipse CDT,如果有人在阅读这篇文章,以下是步骤:
1. 首先,请确保代码中包含以下内容。
`include "mysql_driver.h"`
`include "mysql_connection.h"`
`using namespace sql::mysql;`
2. 确保在Eclipse项目设置中指定了以下内容:
将 `mysql/include` 和 `mysql/include/cppconn` 目录包含进你的头文件列表中,将 `mysql/lib` 目录包含进库目录列表中,然后更重要的是,在链接器选项中添加 `-lmysqlcppconn`。
3. 确保在Eclipse编译器选项中设置了 `-m64`。
4. 运行程序时,可能会出现缺少 `libmysqlcppconn.so.1` 的情况。请将 `libmysqlcppconn.so.1.0.5` 复制到 `/usr/lib64` 目录中,并在该目录下创建一个指向 `libmysqlcppconn.so.1.0.5` 的链接 `libmysqlcppconn.so.1`。
现在,你的程序应该可以正常运行了。

3

您需要连接

-lmysqlcppconn -lmysqlcppconn-static

第一个库包含位于/usr/include/cppconn/下的头文件代码,第二个库包含在mysql_driver.hmysql_connection.h头文件中找到的代码。


2
代码比Makefile更有帮助,但是请尝试在Database.cpp的顶部添加using namespace sql;
// 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: 错误:‘mysql’ 不是命名空间名称,稍后会放上代码。 - Not Available
我说过“top”,但它需要放在包含语句下方。 - dgnorton

2

在使用该库内部的对象文件之后,您需要添加-lmysqlcppconn-static


在编译特定的 .obj 文件时,还是在最终编译的 lib 列表底部? - Not Available
尝试将其添加到主编译和对象(-static 和 -lmysqlcppconn-static)中。 - Not Available

0

我需要-lmysqlclient

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

现在一切都正常了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接