С++/mysql Connector - undefined ссылка на get_driver_instance - уже пробовал легкий материал

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

Я просто хочу запрограммировать mysql с помощью С++. Мой исходный код берется из примера типа "hello world" здесь:

http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-examples-complete-example-1.html

Я на Ubuntu 12.10. Я пытаюсь:

g++ -Wall -o firsttry_prog -I/usr/include/mysqlcppconn -I/usr/local/boost_1_53_0  -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18 -L/usr/lib/mysqlcppconn -lmysqlcppconn  firsttry.cpp

Он компилирует (если я использую -c вариант), но не буду строить, давая мне печально известный:

/tmp/ccn768hj.o: In function `main':
firsttry.cpp:(.text+0x3a): undefined reference to `get_driver_instance'

Несколько деталей:

  • 'firsttry.cpp' - это то, что я назвал файлом исходного кода, снова взятый из официального примера
  • Как вы можете видеть, я подключаюсь в библиотеке mysqlclient и в библиотеке mysqlcppconn. Много раз, когда этот вопрос задавался ранее, ответ заключался в том, чтобы связать их.
  • Некоторые другие исторические ответы предполагают, что исходный код образца неверен и что соответствующая функция должна находиться в пространстве имен sql:: mysql и т.д. Я уверен, что исходный код в порядке. Опять же, он компилируется, и изменение пространств имен в исходном коде просто ухудшает его.

Заранее благодарим за любую помощь, которую вы можете предоставить.

Ответы

Ответ 1

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

Я сначала скомпилировал библиотеку коннекторов С++ из источника, но через некоторое время подумал, что, возможно, я сделал что-то не так, поэтому я просто использовал apt для его получения:

sudo apt-get install  libmysqlcppconn-dev

И вот мой простой исходный файл тестера "tester.cpp"

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

using namespace sql;
int main(void){
  sql::Driver *driver;
  sql::Connection *con;

  driver = get_driver_instance();
  con = driver->connect("tcp://127.0.0.1:3306","root","YOURPASSWORD");

  return 0;
}

И, наконец, команда компиляции g++:

sudo g++ -Wall -I/usr/include/cppconn -o testapp tester.cpp -L/usr/lib -lmysqlcppconn

Это сработало для меня, и я надеюсь, что это поможет вам решить вашу проблему!

Ответ 2

Для меня просто перестановка порядка двух последних аргументов фиксировала эту проблему. Я не знаю, почему, но компоновщик может найти функцию get_driver_instance, если я укажу опцию -lmysqlcppconn в конце после исходного файла.

g++ -Wall -o firsttry_prog -I/usr/include/mysqlcppconn -L/usr/lib/mysqlcppconn firsttry.cpp -lmysqlcppconn

Также обратите внимание, что я выбрал следующие параметры, поскольку я думаю, что они избыточны

-I/usr/local/boost_1_53_0  -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18

Ответ 3

В случае, если вы так же забывчивы, как я, и не связали библиотеку с CMakeLists.txt:

target_link_libraries(<target> mysqlcppconn)

Ответ 4

Если все пути включены, введите param -I. Вы увидите, есть ли проблема, если вы выполните следующее:

g++ -g  -o0  -I/usr/local/include -I/usr/local/boost/include -c main.cpp -o main.o
g++ -g  -o0 -L/usr/local/lib -L/usr/local/mysql/lib -lmysqlcppconn  main.o  -o test  

появится проблема:

main.o: In function `main':
/home/huangxw/workspace/public/soal/test/main.cpp:165: undefined reference to `get_driver_instance'
collect2: ld returned 1 exit status

Теперь вы должны отрегулировать порядок -lmysqlcppconn и main.o:

g++ -g  -o0  -I/usr/local/include -I/usr/local/boost/include -c main.cpp -o main.o
g++ -g  -o0 -L/usr/local/lib -L/usr/local/mysql/lib main.o  -o test  -lmysqlcppconn

Вот и все! Причина проста. Вы можете узнать об этом в Интернете или попросить меня уточнить.