我一直在尝试让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);
}
我该怎么做才能解决这个问题?
答案 0 :(得分:8)
最后,我可以在Ubuntu 10.10中成功编译带有C ++连接器的程序。
最初,我遇到了同样的问题,“未定义引用`get_driver_instance'”来解决这个问题我声明了我的MySQL_Driver类型的驱动程序实例变量。对于准备参考,此类型在mysql_driver.h文件中定义。这是我在程序中使用的代码片段。
sql::mysql::MySQL_Driver *driver;
try {
driver = sql::mysql::get_driver_instance();
}
我用-l mysqlcppconn链接器选项
编译了程序答案 1 :(得分:3)
非常感谢你,我也修好了。我有确切的经历。
我在64位CentOS上使用Eclipse CDT,对于阅读此内容的人来说,这是以下步骤。
include "mysql_driver.h"
include "mysql_connection.h"
using namespace sql::mysql;
确保在Eclipse中您已在Eclipse项目设置中指定。
您的include中的mysql/include
和mysql/include/cppconn
目录以及库目录中的mysql/lib
,然后更重要的是指定-lmysqlcppconn
。
确保您在Eclipse编译器选项中也设置了-m64。
运行程序时,可能会抱怨缺少libmysqlcppconn.so.1
。执行此操作,在libmysqlcppconn.so.1.0.5
目录中复制/usr/lib64
。在该目录中为libmysqlcppconn.so.1
建立libmysqlcppconn.so.1.0.5
链接。
您的程序现在应该运行。
答案 2 :(得分:2)
代码比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
答案 3 :(得分:2)
在使用该库中的内容的目标文件之后,您需要添加-lmysqlcppconn-static
。
答案 4 :(得分:1)
您需要与
相关联-lmysqlcppconn -lmysqlcppconn-static
第一个库包含 / usr / include / cppconn / 中标题的代码,第二个库包含标题 mysql_driver.h 中的代码,的 mysql_connection.h 即可。