c++ mysql ubuntu-12.10

Conector C++/mysql-referencia no definida para get_driver_instance-ya probé las cosas fáciles



ubuntu-12.10 (4)

Sí, esta pregunta se ha hecho antes ... He intentado todo lo mencionado en las respuestas anteriores. Mi configuración es muy sencilla, por lo que no debería ser tan difícil.

Solo quiero programar contra mysql usando C ++. Mi código fuente se toma verbatem del ejemplo de tipo ''hola mundo'' aquí:

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

Estoy en Ubuntu 12.10. Estoy intentando:

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

Se compila (si uso la opción -c) pero no se compila, lo que me da la infame:

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

Algunos detalles:

  • ''firsttry.cpp'' es justo lo que nombré el archivo de código fuente, nuevamente tomado verbatem del ejemplo oficial
  • Como puede ver, YO SOY enlazando en la biblioteca mysqlclient y en la biblioteca mysqlcppconn . Muchas veces, cuando esta pregunta se ha formulado anteriormente, la respuesta fue vincularlas.
  • Algunas otras respuestas históricas sugieren que el código fuente de muestra es incorrecto y que la función en cuestión debe estar en el espacio de nombres sql :: mysql, etc. Estoy bastante seguro de que el código fuente está bien. Una vez más, se compila, y cambiar los espacios de nombres en el código fuente parece empeorar las cosas.

Gracias de antemano por cualquier ayuda que pueda proporcionar.


Así que ahora he tenido este problema durante una semana y también me sentí muy frustrado con él. Ahora solo pude construir un programa que no hace nada, excepto iniciar sesión en mysql y literalmente grité de alegría. Esto es lo que tengo y espero que ayude.

Primero compilé la biblioteca del conector c ++ desde la fuente, pero después de un tiempo pensé que tal vez había hecho algo mal, entonces simplemente utilicé apt para obtenerlo con:

sudo apt-get install libmysqlcppconn-dev

Y aquí está mi archivo fuente de prueba simple "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; }

Y finalmente g ++ compile el comando:

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

¡Esto me funcionó y espero que te ayude a resolver tu problema!


En caso de que seas tan olvidadizo como yo y no hayas vinculado la biblioteca en CMakeLists.txt:

target_link_libraries(<target> mysqlcppconn)


Para mí, simplemente cambiar el orden de los dos últimos argumentos solucionó este problema. No sé por qué, pero el vinculador es capaz de encontrar la función get_driver_instance si especifico la opción -lmysqlcppconn al final después del archivo de origen.

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

También tenga en cuenta que saqué las siguientes opciones ya que creo que son redundantes

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


Si todos los caminos están incluidos, lance param -I. Verías si hay un problema si compilas así:

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

Aparecerá el problema:

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

Ahora debe ajustar el orden de -lmysqlcppconn y 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

¡¡Eso es todo!! La razón es simple. Puedes averiguarlo a través de la web o pedirme que te lo explique.