2010-10-06 25 views
6

我一直試圖讓MySQL的連接器的工作我已經安裝了連接器和MySQL客戶端庫,但我仍然得到這個錯誤:MySQL的C++接口:未定義的引用`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 

使用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

這個問題是噩夢,我兩天都在掙扎,而且無法修復。 – Shravan40 2016-09-29 12:13:26

回答

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 
+0

src/server/Database.hpp:13:error:'mysql'不是一個名字空間名稱,會把代碼放在一個位 – 2010-10-06 12:42:56

+0

我說的是「top」,但它需要在include下面。 – dgnorton 2010-10-06 12:49:23

+0

是的,這是我的地方,但它給出了這個錯誤 – 2010-10-06 12:52:03

2

你需要後加入-lmysqlcppconn-static使用的東西,庫中的目標文件。

+0

在編譯特定的.obj或在最終編譯的lib列表底部? – 2010-10-06 12:49:30

+0

試圖將它添加到主編譯和對象(-static和-lmysqlcppconn-static) – 2010-10-06 12:55:09

3

非常感謝,我也修好了。我有確切的經驗。

我在64位CentOS上使用Eclipse CDT,任何閱讀此文的人都有以下步驟。

  1. 首先,請確保以下內容在代碼中。

include "mysql_driver.h"

include "mysql_connection.h"

using namespace sql::mysql;

  • 確保在Eclipse您在Eclipse項目設置中指定。 mysql/includemysql/include/cppconn目錄在你的include目錄中,然後還有mysql/lib在庫目錄中,那麼更重要的是你指定-lmysqlcppconn

  • 確保您在Eclipse編譯器選項中也設置了-m64。

  • 當你運行你的程序時,它可能會抱怨缺少libmysqlcppconn.so.1。執行此操作,請在您的/usr/lib64目錄中複製libmysqlcppconn.so.1.0.5。在該目錄內建立一個libmysqlcppconn.so.1libmysqlcppconn.so.1.0.5的鏈接。

  • 您的程序現在應該運行。

    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

    您需要

    -lmysqlcppconn -lmysqlcppconn-static 
    

    第一個庫鏈接包含在報頭中的代碼/usr/include目錄/ cppconn/,第二個庫包含頭文件mysql_driver.hmysql_connection.h中的代碼。