2010-10-06 5 views
6

Próbowałem dostać złącze MySQL pracuje mam zainstalowane zarówno złącze i biblioteki klienta mysql ale ja wciąż otrzymuję ten błąd:MySQL C++ Connector: niezdefiniowane odniesienia do `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 

Korzystanie Ubuntu 10.04 a mój makefile jest następujący:

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 

Kodeks

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

Co mogę zrobić, aby to naprawić?

+0

Ten numer to koszmar, walczę od dwóch dni i nie mogę go naprawić. – Shravan40

Odpowiedz

2

Kod byłby bardziej przydatny niż plik make, ale spróbuj dodać using namespace sql; do góry 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: error: "mysql" nie jest nazwą przestrzeni nazw, Wstawi kod w nieco –

+0

Powiedziałem "do góry", ale musi on zejść poniżej załączników. – dgnorton

+0

Tak, to gdzie umieściłem, ale daje ten błąd –

2

Musisz dodać -lmysqlcppconn-staticpo pliki obiektów, które używa rzeczy wewnątrz tej biblioteki.

+0

Jak w kompilacji tego konkretnego .obj lub na dole listy lib ostatecznej kompilacji? –

+0

Próbowano dodać go zarówno do głównej kompilacji, jak i do obiektu (-static i -lmysqlcppconn-static) –

3

Dziękuję bardzo, mam to również naprawione. Miałem dokładne doświadczenie.

Używam Eclipse CDT na 64-bitowym CentOS i dla każdego, kto czyta to tutaj, są następujące kroki.

  1. najpierw upewnij się, że w kodzie znajdują się następujące elementy.

include "mysql_driver.h"

include "mysql_connection.h"

using namespace sql::mysql;

  1. Pamiętaj, że w Eclipse podałeś w ustawieniach projektu Eclipse. katalogi mysql/include i w katalogu włączania, a następnie mysql/lib w katalogu biblioteki, a następnie - co ważniejsze - pod określeniem -lmysqlcppconn.

  2. Należy się również upewnić, że zestaw -m64 znajduje się w opcjach kompilatora Eclipse.

  3. Po uruchomieniu programu może narzekać brakujące libmysqlcppconn.so.1. Zrób to, skopiuj plik libmysqlcppconn.so.1.0.5 do katalogu /usr/lib64. Utwórz link z libmysqlcppconn.so.1 w kierunku libmysqlcppconn.so.1.0.5 w tym katalogu.

Twój program powinien teraz działać.

8

Wreszcie udało mi się skompilować program ze złączem C++ w Ubuntu 10.10.

Początkowo napotkałem ten sam problem z "niezdefiniowanym odniesieniem do` get_driver_instance '", aby rozwiązać ten problem. Deklaruję zmienną instancji mojego sterownika typu MySQL_Driver. Dla gotowego odniesienia ten typ jest zdefiniowany w pliku mysql_driver.h. Oto fragment kodu użyty w moim programie.

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

i skompilowany program z opcją łącznikowej -l mysqlcppconn

1

trzeba połączyć z

-lmysqlcppconn -lmysqlcppconn-static 

Pierwsza biblioteka zawiera kod dla nagłówków w /usr/include/cppconn/, a druga biblioteka zawiera kod znaleziony w nagłówkach mysql_driver.h i mysql_connection.h.