MySQL C ++ Connector: неопределенная ссылка на get_driver_instance - PullRequest
6 голосов
/ 06 октября 2010

Я пытался заставить работать коннектор 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 И мой make-файлследующим образом:

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

Что я могу сделать, чтобы это исправить?

Ответы [ 5 ]

8 голосов
/ 20 июля 2011

Наконец-то я смог успешно скомпилировать программу с соединителем C ++ в Ubuntu 10.10.

Изначально я столкнулся с той же проблемой с «неопределенной ссылкой на get_driver_instance», чтобы решить эту проблему, я объявляю переменную моего экземпляра драйвера типа MySQL_Driver. Для удобства использования этот тип определен в файле mysql_driver.h. Вот фрагмент кода, который я использовал в своей программе.

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

и я скомпилировал программу с опцией -l mysqlcppconn linker

3 голосов
/ 06 января 2011

Большое спасибо, я тоже это исправил. У меня был точный опыт.

Я использую Eclipse CDT на 64-битной CentOS, и для всех, кто читает это, выполните следующие действия.

  1. Во-первых, убедитесь, что в коде есть следующие слова.

include "mysql_driver.h"

include "mysql_connection.h"

using namespace sql::mysql;

  1. Убедитесь, что в Eclipse вы указали в настройках проекта Eclipse. каталоги mysql/include и mysql/include/cppconn в вашем включаемом файле, а затем mysql/lib в каталоге библиотеки, и, что более важно, вы указываете -lmysqlcppconn.

  2. Убедитесь, что вы также установили -m64 в опциях компилятора Eclipse.

  3. Когда вы запускаете вашу программу, она может жаловаться на отсутствие libmysqlcppconn.so.1. Сделайте это, скопируйте libmysqlcppconn.so.1.0.5 в каталог /usr/lib64. В этом каталоге создайте ссылку libmysqlcppconn.so.1 на libmysqlcppconn.so.1.0.5.

Ваша программа должна запуститься.

2 голосов
/ 06 октября 2010

Вам нужно будет добавить -lmysqlcppconn-static после объектных файлов, которые используют вещи внутри этой библиотеки.

2 голосов
/ 06 октября 2010

Код будет более полезным, чем файл 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
1 голос
/ 06 апреля 2015

Вам нужно связать с

-lmysqlcppconn -lmysqlcppconn-static

Первая библиотека содержит код для заголовков в / usr / include / cppconn / , а вторая библиотека содержит код, найденный в заголовках mysql_driver.h и mysql_connection.h .

...