2010-10-06 11 views
6

Ich habe versucht, den MySQL-Anschluss zum Laufen zu bringen ich sowohl den Anschluss und die MySQL-Client-Bibliothek installiert haben, aber ich bin immer noch diesen Fehler:MySQL C++ Anschluss: 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 

Mit Ubuntu 10.04 Und mein Make-Datei ist wie folgt:

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 

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

Was kann ich tun, um das Problem zu beheben?

+0

Dieses Problem ist Alptraum, ich habe seit zwei Tagen zu kämpfen, und nicht in der Lage, es zu beheben. – Shravan40

Antwort

2

Der Code wäre hilfreicher als die make-Datei, aber versuchen Sie using namespace sql; an der Spitze von Database.cpp hinzuzufügen.

// 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: Fehler: 'mysql' ist kein Namespace-Name, Wird Code in einem Bit –

+0

Ich sagte "top", aber es muss unter die Includes gehen. – dgnorton

+0

Ja, das ist, wo ich es stelle, aber es gibt diesen Fehler –

2

Sie benötigen -lmysqlcppconn-staticnach die Objektdateien hinzufügen, die Sachen innerhalb dieser Bibliothek verwendet.

+0

Wie bei der Kompilierung dieser spezifischen .obj oder am Ende der Lib-Liste der endgültigen kompilieren? –

+0

Versucht, es sowohl zum Hauptcompile als auch zum Objekt hinzuzufügen (-static und -lmysqlcppconn-static) –

3

Vielen Dank, ich habe es behoben. Ich hatte die genaue Erfahrung.

Ich benutze Eclipse CDT auf 64 Bit CentOS und für jeden, der dies hier liest, sind die folgenden Schritte.

  1. zuerst, stellen Sie sicher, dass die folgenden im Code enthalten sind.

include "mysql_driver.h"

include "mysql_connection.h"

using namespace sql::mysql;

  1. sicher sein, dass in Eclipse Sie in Ihren Eclipse-Projekteinstellungen festgelegt haben. die mysql/include und mysql/include/cppconn Verzeichnisse in Ihrem Include und dann auch die mysql/lib im Bibliotheksverzeichnis, dann und noch wichtiger, geben Sie -lmysqlcppconn an.

  2. Stellen Sie sicher, dass Sie die Option -m64 auch in den Eclipse-Compileroptionen festgelegt haben.

  3. Wenn Sie Ihr Programm ausführen, kann es sich beschweren, dass libmysqlcppconn.so.1 fehlt. Kopieren Sie hierzu libmysqlcppconn.so.1.0.5 in Ihr Verzeichnis /usr/lib64. Machen Sie einen Link von libmysqlcppconn.so.1 in Richtung libmysqlcppconn.so.1.0.5 innerhalb dieses Verzeichnisses.

Ihr Programm sollte nun ausgeführt werden.

8

Schließlich konnte ich ein Programm mit C++ - Konnektor in Ubuntu 10.10 erfolgreich kompilieren.

Anfangs hatte ich das gleiche Problem mit "undefinierter Referenz auf` get_driver_instance '", um dies zu lösen. Ich deklariere meine Treiberinstanzvariable vom Typ MySQL_Driver. Als Referenz wird dieser Typ in der Datei mysql_driver.h definiert. Hier ist das Code-Snippet, das ich in meinem Programm verwendet habe.

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

und ich das Programm mit -l mysqlcppconn Linker-Option kompiliert

1

Sie müssen sich mit

-lmysqlcppconn -lmysqlcppconn-static 

Die erste Bibliothek enthält den Code für die Header in /usr/verknüpfen include/cppconn/, und die zweite Bibliothek enthält den Code in den Headern mysql_driver.h und mysql_connection.h.