Коннектор C ++ / mysql - неопределенная ссылка на get_driver_instance - уже пробовал простые вещи

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

Я просто хочу программировать против mysql, используя C ++. Мой исходный код взят из примера типа '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 и т. Д. Я почти уверен, что исходный код в порядке. Опять же, он компилируется, и изменение пространств имен в исходном коде только ухудшает ситуацию.

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


person Ray in NY    schedule 14.04.2013    source источник
comment
Что это -l:libmysqlclient_r.so.18? Разве это не должно быть -lmysqlclient_r?   -  person Alexander Shukaev    schedule 14.04.2013
comment
Спасибо, Харуган. Я получил это -l: business по ссылке - я считаю, что это просто способ указания полного имени файла, когда символическая ссылка в обычном стиле именования не существует, как это не было для меня. Поэтому, если я попробовал -lmysqlclient_r, он сказал мне, что не может найти -lmysqlclient_r. Основываясь на ваших отзывах, я сделал символическую ссылку, теперь я могу использовать -lmysqlclient_r ... и получаю ту же ошибку о «get_driver_instance». Есть другие мысли?   -  person Ray in NY    schedule 14.04.2013
comment
Попробуйте сначала скомпилировать firsttry.cpp в firsttry.o, а затем скомпилировать его с этими библиотеками MySQL в исполняемый файл. Т.е. вот так: g++ -Wall -I/usr/include/mysqlcppconn -I/usr/local/boost_1_53_0 -o firsttry.o firsttry.cpp и g++ firsttry.o -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18 -L/usr/lib/mysqlcppconn -lmysqlcppconn -o firsttry.   -  person Alexander Shukaev    schedule 14.04.2013
comment
Это интересно ... как я уже отмечал выше, он по-прежнему компилируется в файл .o без проблем. Однако, когда я пытаюсь связать его (ваша вторая команда, хотя я сейчас пробовал несколько вариантов с тем же результатом), я получаю несколько десятков ошибок, все в такой форме: /usr/lib/mysqlcppconn/libmysqlcppconn.so: undefined reference to mysql_stmt_execute@libmysqlclient_18' и так далее, все неопределенные ссылки в libmysqlcppconn ... почему это было бы?   -  person Ray in NY    schedule 14.04.2013
comment
Измените порядок: -lmysqlcppconn -l:libmysqlclient_r.so.18.   -  person Alexander Shukaev    schedule 14.04.2013
comment
спасибо ... пробовал, без разницы. Кстати, я также пробовал добавить mysql_config --cflags --libs, как было предложено ссылка ... не работает (не для этого человека ;-))   -  person Ray in NY    schedule 14.04.2013
comment
ОБНОВЛЕНИЕ - хорошо, я могу запустить его, используя статически связанную библиотеку -lmysqlcppconn-static вместо -lmysqlcppconn Это удовлетворяет мои непосредственные потребности, но мне все еще очень любопытно, почему динамическая версия не работает, я чувствую, что есть что-то фундаментальное, что я должен отсутствовать ...   -  person Ray in NY    schedule 14.04.2013
comment
Возможно, вы захотите проверить, действительно ли get_driver_instance присутствует в динамической версии, т.е. действительно ли он экспортирует этот символ? Вы можете сделать это, запустив nm libmysqlcppconn.so   -  person Alexander Shukaev    schedule 14.04.2013
comment
У меня это работает в Mac OS с помощью этой команды: g++ firsttry.cpp -I/opt/local/include/mysql5-connector-cpp/driver -I/opt/local/include/mysql5-connector-cpp -L/opt/local/lib/mysql5-connector-cpp -lmysqlcppconn ... если я опущу -lmysqlcppconn, я получаю предупреждение с неопределенным символом, аналогичное тому, о котором написано здесь. Возможно, посмотрите, находятся ли ваша статическая и динамическая библиотеки в одном каталоге.   -  person John Zwinck    schedule 14.04.2013


Ответы (4)


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

Сначала я скомпилировал библиотеку коннекторов C ++ из исходного кода, но через некоторое время я подумал, что, возможно, я сделал что-то не так, поэтому я просто использовал 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

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

person d3l    schedule 15.04.2013
comment
Да, это сработало! Замечательное спасибо. В частности, сработало получение библиотеки через apt-get install вместо того, чтобы либо (A) пытаться собрать ее из исходного кода (у вас не сработало), либо даже (B) загружать библиотеки с сайта MySQL и сам помещать в них папки (у меня не сработало.) Большое спасибо! - person Ray in NY; 15.04.2013
comment
Хотя этот вопрос решен, меня по-прежнему испытывает жгучее любопытство по поводу того, что я вообще делал неправильно. Конечно, я немного устарел на моем C ++ и новичок в Linux, так что, возможно, это была настоящая ошибка новичка. Я предполагаю, что это должно иметь какое-то отношение к расположению каталогов ... apt-get install поместил mysqlcppconn прямо в корень / usr / lib, в то время как я был в подкаталоге и т. Д. Но не должно ли это быть хорошо, пока я указывал полный путь при сборке программы, а я это делал? Даже на этапе компиляции он говорил мне, что мне нужно также указать Boost и т. Д. - person Ray in NY; 15.04.2013
comment
Отличное решение, даже мне нужно сначала удалить существующий libmysqlcppconn-dev, а затем следовать тому, что вы сказали. работает gread после двух дней усилий! Я не знаю, что люди mysql сохранили в своей документации. - person Catty; 06.09.2013
comment
@RayinNY Вы запускали ldconfig после загрузки библиотек и размещения их в этих папках? - person Chandranshu; 12.11.2013
comment
Большое спасибо :) Все, что мне было нужно, это последняя строчка: P (компиляция) - person Severus Tux; 22.10.2016
comment
Чувак, не могу передать, насколько это было неприятно. Большое спасибо за заметки здесь! - person Phyllis Sutherland; 14.11.2016

Для меня простая перестановка последних двух аргументов устранила эту проблему. Я не знаю почему, но компоновщик может найти функцию 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
person Tarun    schedule 22.08.2013
comment
Да, у меня это тоже сработало, буквально как описано, перемещение флага ссылки в конец команды без удаления каких-либо дополнительных флагов - кто-нибудь понимает, как? - person Brizee; 02.06.2016
comment
То же самое! Супер раздражает, но так рада, что я разобралась, спасибо тебе! Но теперь, когда он работает, как спросил @Brizee, есть ли у кого-нибудь представление о том, почему это должно быть так? Было бы замечательно, если бы кто-нибудь мог указать на какую-нибудь документацию. - person DanielM; 20.06.2018

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

target_link_libraries(<target> mysqlcppconn)
person nakajuice    schedule 17.10.2015
comment
Привет, что должно быть <target>? Я также использую CMakeLists.txt, и ваш ответ, скорее всего, мог бы меня спасти. - person Haohan Wang; 25.01.2016
comment
Target - это имя, которое вы использовали после add_executable (myproj). В этом случае myproj. schneide.wordpress.com/2016/04/08/ < / а> - person user584583; 28.07.2017

Если все пути включены, бросьте 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

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

person huangxiaowei    schedule 12.11.2013
comment
Я запутался в двух вопросах. 1) почему это имеет значение и 2) как я должен указать, что это происходит ПОСЛЕ моего main.o с использованием autotools / automake? - person Discordanian; 29.08.2014