2010-10-06 99 views
6

J'ai essayé d'obtenir le connecteur MySQL de travail que j'ai installé le connecteur et la bibliothèque client MySQL mais je reçois toujours cette erreur:MySQL C++ connecteur: undefined reference to `get_driver_instance »

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 

utilisant Ubuntu 10.04 Et mon makefile est la suivante:

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 

Le code

// 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); 
} 

Que puis-je faire pour résoudre ce problème?

+0

Ce problème est cauchemardesque, je me bats depuis deux jours, et je n'arrive pas à le réparer. – Shravan40

Répondre

2

Le code serait plus utile que le fichier make mais essayez d'ajouter using namespace sql; en haut de 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 
+0

src/server/Database.hpp: 13: erreur: 'mysql' n'est pas un nom d'espace de noms, va mettre du code dans un bit –

+0

J'ai dit "top" mais il faut aller en dessous des inclus. – dgnorton

+0

Ouais c'est où je l'ai mis mais il donne cette erreur –

2

Vous devez ajouter -lmysqlcppconn-staticaprès les fichiers objet qui utilise des choses dans cette bibliothèque.

+0

Comme dans la compilation de ce .obj spécifique ou en bas de la liste de la compilation finale de la bibliothèque? –

+0

J'ai essayé de l'ajouter à la fois à la compilation principale et à l'objet (-static et -lmysqlcppconn-static) –

3

Merci beaucoup, je l'ai réparé aussi. J'ai eu l'expérience exacte. J'utilise Eclipse CDT sur 64 bits CentOS et pour quiconque lit ceci, voici les étapes suivantes. Tout d'abord, assurez-vous que les éléments suivants sont dans le code

include "mysql_driver.h"

include "mysql_connection.h"

using namespace sql::mysql;

  1. Assurez-vous que dans Eclipse vous avez spécifié dans les paramètres de projet Eclipse. les répertoires mysql/include et mysql/include/cppconn dans votre inclusion, puis le mysql/lib dans le répertoire de la bibliothèque, puis, plus important encore, vous spécifiez -lmysqlcppconn.

  2. Assurez-vous d'avoir le jeu -m64 dans les options du compilateur Eclipse. Lorsque vous exécutez votre programme, il peut se plaindre de libmysqlcppconn.so.1 manquant. Pour ce faire, copiez libmysqlcppconn.so.1.0.5 dans votre répertoire /usr/lib64. Faites un lien de libmysqlcppconn.so.1 vers libmysqlcppconn.so.1.0.5 dans ce répertoire.

Votre programme devrait maintenant fonctionner.

8

Enfin je pourrais compiler avec succès un programme avec le connecteur C++ dans Ubuntu 10.10.

Initialement, j'ai fait face au même problème avec "référence non définie à` get_driver_instance '"pour résoudre ce problème, je déclare ma variable d'instance de pilote de type MySQL_Driver. Pour référence, ce type est défini dans le fichier mysql_driver.h. Voici l'extrait de code que j'ai utilisé dans mon programme.

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

et je compilé le programme avec l'option de liaison -l mysqlcppconn

1

Vous devez créer un lien avec

-lmysqlcppconn -lmysqlcppconn-static 

La première bibliothèque contient le code pour les en-têtes dans /usr/include/cppconn/, et la deuxième bibliothèque contient le code trouvé dans les en-têtes mysql_driver.h et mysql_connection.h.