cpp коннектора mysql в centos 6 неопределенная ссылка на

Я уже установил mysql cpp connector и Boost, а также компилятор g++.

Когда я пишу программу, использующую mysql cpp connector, она выдает ошибку:

demo.cpp:(.text+0x3a): неопределенная ссылка на 'get_driver_instance'
collect2: ld вернул 1 статус выхода

Команда, которую я использую для создания этого кода:

g++ demo.cpp -o demo

Мой исходный код:

#include <stdlib.h>
#include <iostream>
#include "mysql_connection.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

using namespace std;

int main(void)
{
   cout << endl;
   cout << "Running 'SELECT 'Hello World!'  AS _message'..." << endl;

   try {
      sql::Driver *driver;
      sql::Connection *con;
      sql::Statement *stmt;
      sql::ResultSet *res;

      /* Create a connection */
      driver = get_driver_instance();
      con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
      /* Connect to the MySQL test database */
      con->setSchema("test");

      stmt = con->createStatement();
      res = stmt->executeQuery("SELECT 'Hello World!' AS _message"); // replace            with your statement
      while (res->next()) {
         cout << "\t... MySQL replies: ";
         /* Access column data by alias or column name */
         cout << res->getString("_message") << endl;
         cout << "\t... MySQL says it again: ";
         /* Access column fata by numeric offset, 1 is the first column */
         cout << res->getString(1) << endl;
      }
      delete res;
      delete stmt;
      delete con;
   }
   catch (sql::SQLException &e) {
      cout << "# ERR: SQLException in " << __FILE__;
      cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
      cout << "# ERR: " << e.what();
      cout << " (MySQL error code: " << e.getErrorCode();
      cout << ", SQLState: " << e.getSQLState() << " )" << endl;
   }

   cout << endl;

   return EXIT_SUCCESS;
}

Кто-нибудь может предложить какое-нибудь решение этой проблемы?
Я уже столько всего перепробовал, но ничего не вышло.
Нужно ли мне все переустанавливать?

я уже следил за

Этапы установки MySQL-коннектора

как описано в справке MySQL.


person VasaraBharat    schedule 26.07.2017    source источник
comment
Похоже проблема с компоновщиком. To use the static Connector/C++ library, link against two library files, libmysqlcppconn-static.a and libmysqlclient.a. здесь. Или динамическая библиотека: To use the Connector/C++ dynamic library, link your project with a single library file, libmysqlcppconn.so.   -  person Andre Kampling    schedule 26.07.2017
comment
уже пробовал mysql_driver.h заголовочный файл, но он дает конфликты в вызове метода get_driver_instance().   -  person VasaraBharat    schedule 26.07.2017
comment
Проблема не в заголовке. Это проблема компоновщика, поэтому свяжите нужные библиотеки.   -  person Andre Kampling    schedule 26.07.2017
comment
сэр, я использую командную строку для запуска этого кода. Можете ли вы предложить мне, как я могу связать библиотеку с помощью команды?   -  person VasaraBharat    schedule 26.07.2017
comment
Пожалуйста, отредактируйте свой вопрос и покажите текущую команду g++.   -  person Andre Kampling    schedule 26.07.2017
comment
Если у вас установлены библиотеки, это должно работать: g++ demo.cpp -o demo -lmysqlcppconn   -  person Andre Kampling    schedule 26.07.2017
comment
Спасибо большое, сэр. эта команда решила мою проблему.   -  person VasaraBharat    schedule 26.07.2017


Ответы (2)


Ваша текущая команда сборки: g++ demo.cpp -o demo не содержит информации для компоновщика ld, с которым библиотеки должны быть связаны. Из-за этого вы получаете ошибку компоновщика:

demo.cpp:(.text+0x3a): неопределенная ссылка на 'get_driver_instance'
collect2: ld вернул 1 статус выхода

В этой документации находится написано какие библиотеки нужны.

Вы можете связать статическое или динамическое соединение.
Статическое связывание означает, что ваш исполняемый файл будет работать на компьютерах, на которых не установлены необходимые библиотеки, поскольку библиотеки находятся внутри исполняемого файла. Это также увеличивает размер исполняемого файла. В случае с MySQL Connector/C++ библиотеками являются: libmysqlcppconn-static.a и libmysqlclient.a
Динамическое связывание означает, что исполняемый файл должен будет найти библиотеки на машине, на которой он должен работать. Необходимая библиотека: libmysqlcppconn.so.

Ваша команда сборки с динамической компоновкой (с использованием libmysqlcppconn.so) должна выглядеть так:

g++ demo.cpp -o demo -lmysqlcppconn

Далее обратите внимание на разницу между -l и -L, как указано здесь на SO или здесь, в официальной документации компоновщика gcc:

-L — это путь к каталогам, содержащим библиотеки. Путь поиска библиотек.

-l — это имя библиотеки, на которую вы хотите установить ссылку.

Вам не нужен путь (-L) здесь, так как библиотеки должны лежать под /usr/local/lib, который является установкой по умолчанию и уже находится в пути поиска компоновщика.

person Andre Kampling    schedule 26.07.2017
comment
Привет @Vasara, если этот или любой другой ответ решил ваш вопрос, рассмотрите возможность принятия его, нажав на галочку. Это показывает более широкому сообществу, что вы нашли решение, и повышает репутацию как отвечающего, так и вас самих. Нет никаких обязательств делать это. - person Andre Kampling; 16.08.2017

Пожалуйста, попробуйте (создано с использованием eclipse):

Building file: ./stack.cpp
Invoking: GCC C++ Compiler
g++ -I/opt/mysql-connector-c++-1.1.7-linux-glibc2.5-x86-64bit/include - I/opt/boost_1_61_0 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF "./stack.d" -MT "./stack.o" -o "./stack.o" "./stack.cpp"

Building target: mysqlExample
Invoking: GCC C++ Linker
g++ -Wl,--allow-shlib-undefined -L/opt/mysql-connector-c++-1.1.7-linux-glibc2.5-x86-64bit/lib -o "mysqlExample" ./stack.o -lmysqlcppconn

и измените путь mysql-connector с вашими именами и именами файлов.

person Harneet Singh    schedule 26.07.2017