Как исправить неразрешенный внешний символ из-за MySql Connector C ++? - PullRequest
9 голосов
/ 17 декабря 2010

Я следовал этому уроку http://blog.ulf -wendel.de /? P = 215 # привет . Я пробовал как на Visual C ++ 2008, так и на Visual C ++ 2010. И статический, и динамический компилятор выдает мне точно такие же сообщения об ошибках:

error LNK2001: unresolved external symbol _get_driver_instance

Кто-нибудь сталкивался с этой проблемой раньше?

Обновление:
+ Дополнительные зависимости: mysqlcppconn.lib
+ Дополнительные каталоги включения: C: \ Program Files \ MySQL \ MySQL Connector C ++ 1.0.5 \ include
+ Дополнительные каталоги библиотек: C: \ Program Files \ MySQL \ MySQL, Connector C ++ 1.0.5 \ lib \ opt

Еще одно обновление: Нажмите F12 в get_driver_instance (), связанном с:

class CPPCONN_PUBLIC_FUNC Driver
{
protected:
    virtual ~Driver() {}
public:
    // Attempts to make a database connection to the given URL.

    virtual Connection * connect(const std::string& hostName, const std::string& userName, const std::string& password) = 0;

    virtual Connection * connect(std::map< std::string, ConnectPropertyVal > & options) = 0;

    virtual int getMajorVersion() = 0;

    virtual int getMinorVersion() = 0;

    virtual int getPatchVersion() = 0;

    virtual const std::string & getName() = 0;
};

} /* namespace sql */

extern "C"
{
  CPPCONN_PUBLIC_FUNC sql::Driver *get_driver_instance();
}

Видимо, функция существовала, но компоновщик не смог ее найти.

Фрагмент кода:

#include <iostream>
#include <sstream>
#include <memory>
#include <string>
#include <stdexcept>

using namespace std;

#include "mysql_connection.h"
#include "mysql_driver.h" 

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

int main() {

    try {
        sql::Driver *driver;
        sql::Connection *conn;
        sql::Statement *stmt;
        sql::ResultSet *res;
        driver = get_driver_instance();
        conn = driver->connect( "http://localhost/chandb", "root", "chan" );


        stmt = conn->createStatement();
        res = stmt->executeQuery( "select * from another" );
        while( res->next() ) {
            cout << "id = " << res->getInt( "Id" );
            cout << "id = " << res->getInt( "GoldValue" );
            cout << "id = " << res->getString( "Model" );
        }

        delete conn;
        delete stmt;
        delete res;
        std::cout << "This is it";
    }
    catch( sql::SQLException e ) {
        cout << e.what();
    }
}

Спасибо
Чан

Ответы [ 8 ]

4 голосов
/ 29 декабря 2010

Согласно Справочное руководство по MySQL 5.1 , если вы используете версию 1.1 MySQL, Connector C ++:
"get_driver_instance () теперь доступен только в динамических сборках библиотеки - статические сборки не иметь этот символ Это было сделано для обеспечения загрузки DLL с помощью LoadLibrary или dlopen. Если вы не используете CMake для сборки исходного кода, вам нужно определить mysqlcppconn_EXPORTS, если вы загружаете динамически и хотите использовать точку входа get_driver_instance (). "
Если я правильно понимаю предыдущую заметку, вы должны использовать динамическую сборку и определить mysqlcppconn_EXPORTS.

3 голосов
/ 17 декабря 2010

Если вы используете статическое связывание, вам нужно установить CPPCONN_PUBLIC_FUNC= в Project / Properties / C++ / Preprocessor / Preprocessor Definitions

2 голосов
/ 11 февраля 2014

Я столкнулся с той же ошибкой при использовании c ++ / Sql Connector.и потратив целый день, я решил эту проблему с помощью 32-битной libmysql.dll, 32-битной libmysqlcppcon.lib и 32-битной libmysqlcppcon.dll (динамическое связывание используется, поскольку создание экземпляра драйвера доступно только в динамической библиотеке libmysqlcppcon.lib)

Я нашел очень хорошую ссылку, объясняющую все вместе с рабочим кодом.Я думаю, что это помогло бы другим, если бы они застряли в той же проблеме.

http://r3dux.org/2010/11/how-to-use-mysql-connectorc-to-connect-to-a-mysql-database-in-windows/

1 голос
/ 31 декабря 2010

Я не знаю, настроены ли вы на использование this MySQL Connector / Driver, но есть много надежных оболочек базы данных, доступных бесплатно или почти бесплатно, если это вызывает, казалось бы, невысказанные головные боли для тебя.

На самом деле я был очень впечатлен объектами базы данных QT, когда использовал их ранее для проекта модели данных. Платформа QT лицензирована по лицензии LGPL, а также имеет коммерческую версию и представляет собой очень универсальный набор кроссплатформенных библиотек. Объекты QtSql предоставляют согласованный интерфейс для многих баз данных, включая MySql, SQLServer, Postgres, ODBC и т. Д., С возможностью замены ваших собственных драйверов и при этом все еще используют один и тот же интерфейс для всего на высоком уровне в C ++

Некоторые другие заметные опции:

SQLAPI ++

MySQL ++

Я не пытаюсь продвинуться как продавец или что-то в этом роде, и я не имею никакого отношения ни к одному из них, но иногда мне не больно ходить по магазинам и находить что-то, что работает лучше для ваших нужд.

1 голос
/ 30 декабря 2010

Я прочитал статью, которую вы упомянули. У него есть эта строка для статической компиляции: Как уже говорилось, вам нужно связать и "mysqlcppconn-static.lib", и "libmysql.lib".

Поскольку вы не упоминаете этот вопрос, вы пытались это сделать?

Также на форуме я прочитал (для eclips): «Вы должны иметь это в источнике»:

#include "mysql_driver.h" 
#include "mysql_connection.h"
using namespace sql::mysql; 

В любом случае, удачи!

1 голос
/ 27 декабря 2010

ошибка LNK2001: неразрешенная внешняя символ _get_driver_instance

Это сообщение об ошибке в основном означает, что компоновщик нигде не может найти функцию get_driver_instance, например. его нет ни в одном из объектных файлов ваших модулей компиляции, ни в статической библиотеке .lib, ни в библиотеке импорта. Это также может произойти, если искаженные имена в библиотеке не совпадают точно с тем, что компоновщик ожидает найти. например. Библиотека была построена с другим соглашением о вызовах и т. Д.

Я бы посоветовал вам взглянуть на последнюю командную строку, используемую в вашем проекте, и обновить свой пост здесь для компиляции и компоновки. Во-вторых, убедитесь, что библиотека mysql, с которой вы ссылаетесь, имеет эту функцию. Я считаю, что в vs есть инструмент командной строки для выгрузки и просмотра содержимого статической библиотеки.

Если вы ссылаетесь на динамическую dll-версию mysql, убедитесь, что в библиотеке импорта отсутствует пропущенный ссылочный символ. Кроме того, вы можете взломать библиотеку DLL с помощью средства просмотра PE и заглянуть в его таблицы экспорта, чтобы убедиться, что эта функция действительно существует и является видимой.

Редактировать: Согласно этого поста , функция get_driver_instance должна быть где-то в 'mysqlcppconn.lib'. Вы уверены, что файл правильно связан?

0 голосов
/ 09 августа 2016

Я потратил несколько часов, пытаясь решить проблему точно так же, как и вы.Я наконец-то выяснил проблему сам.Я скачал 64-битную версию MySQL / SQL Connector и следовал руководству на MySQL.com по настройке консольного проекта win32 и получил сообщение об ошибке, как упоминалось.Это было потому, что учебник учит, чтобы построить 32-битную программу.После того, как я перешел на сборку версии кода X64, проблема была решена.Убедитесь, что ваша библиотека является 32-битной или 64-битной, а затем настройте Visual Studio соответствующим образом (в диспетчере конфигурации).

0 голосов
/ 09 января 2011

Я решил использовать 32-битную версию как для сервера MySQL, так и для коннектора / c ++ на 64-битной ОС.Я думаю, что проблема в библиотеках буста, но я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...