2012-04-12 16 views
6

Recibo mensajes undefined reference to '[email protected]#' al intentar vincular mi programa con las bibliotecas MySQL provistas con el servidor 5.5. Cuando se instaló MySQL, utilicé la ruta predeterminada, que para mí en Windows es C:\Program Files\MySQL\MySQL Server 5.5\. Originalmente, había pensado que los espacios estaban causando mi dolor, pero creo que he resuelto correctamente cómo apuntar a la ruta de la biblioteca sin espacios (aún sin suerte). Si hay otra causa probable, házmelo saber.Referencia indefinida a bibliotecas MySQL usando g ++

He revisado una serie de preguntas en este sitio tratando de resolver mi problema ...

Usando MinGW/g ++, he tratado de vincular el uso de las siguientes opciones, basado en mi propia investigación, así como sugerencias aquí:

  • -L "C: \ Archivos de programa \ MySQL \ MySQL Server 5.5 \ lib \ "-llibmysql.lib
  • -L "C: \ archivos de programa \ MySQL \ MySQL Server 5.5 \ lib \" -lmysqlclient.lib
  • -L" C: \ Progra ~ 1 \ MySQL \ MySQLS ~ 1.5 \ lib \ "-llibmysql.lib
  • -LC: \ Progra ~ 1 \ MySQL \ MySQLS ~ 1,5 \ lib \ -lmysqlclient.lib
  • -L "C: \ Progra ~ 1 \ MySQL \ MySQLS ~ 1,5 \ lib \" -lmysql

En todos los casos, he puesto las opciones -L/-l en la parte derecha de la declaración, ya que entiendo que esto puede importar.

He confirmado que las bibliotecas existen. En el/lib dir, tengo libmysql.lib, mysqlclient.lib y libmysql.dll. No he intentado vincularme con .dll, ya que ningún tutorial/foro que he revisado sugirió.

No estoy usando MAKEFILES.

¿Alguien tiene experiencia específica con g ++/MySQL?

+2

Use 'dir/x' esto le da los nombres cortos para cada carpeta. De esta forma puede obtener la ruta a la biblioteca sin ningún espacio. – Raam

+0

@Raam Eso fue útil. A pesar de usar DOS por años, nunca aprendí ese truco ... Desafortunadamente, no parece que esto haya resuelto el problema de mi biblioteca/vinculador. – Gaffi

Respuesta

1

Los siguientes comandos funcionan bien para mí usando GCC 4.6.1 a partir de noviembre de 2011:

g++ my.cpp -I D:\Opt\MySQL5.5\include^
    D:\Opt\MySQL5.5\lib\libmysql.dll -o myWithDll.exe 

g++ my.cpp -I D:\Opt\MySQL5.5\include^
    -L D:\Opt\MySQL5.5\lib -lmysql -o myWithLib.exe 

Así pues, tanto el ligado con el LIB y DLL funcionan.

Puede recibir una advertencia (consulte el comentario de Gaffi). Esto se debe a que el vinculador hace enlaces difusos para usted sin que lo haya especificado; normalmente, no habría podido vincular.Sin embargo, está siendo amable y hace que funcione para usted, al mismo tiempo que le advierte sobre las cosas que suceden sin que usted las haya solicitado. La manera de suprimir la advertencia es hacer borrosa la vinculación explícita:

g++ -Wl,--enable-stdcall-fixup my.cpp -I D:\Opt\MySQL5.5\include^
    D:\Opt\MySQL5.5\lib\libmysql.dll -o myWithDll.exe 

g++ -Wl,--enable-stdcall-fixup my.cpp -I D:\Opt\MySQL5.5\include^
    -L D:\Opt\MySQL5.5\lib -lmysql -o myWithLib.exe 

Esta es una extensión de Cygwin/RedHat/MinGW al enlazador; the docs are here:

--enable-stdcall-fixup 
--disable-stdcall-fixup 

Si el enlace [er] encuentra un símbolo que no puede resolver, se intentará hacer “vinculación difusa” mirando para otro símbolo definido que difiere sólo en el formato de la el nombre del símbolo (cdecl vs stdcall) y será resolver ese símbolo mediante el enlace a la coincidencia. Por ejemplo, el símbolo indefinido _foo podría estar vinculado a la función _foo @ 12, o el símbolo indefinido _bar @ 16 podría estar vinculado a la función _bar. Cuando el vinculador hace esto, imprime una advertencia, ya que normalmente debería no haber podido vincular, pero a veces las bibliotecas de importación generadas a partir de pueden necesitar esta característica para ser utilizables. Si especifica - enable-stdcall-fixup, esta función está completamente habilitada y las advertencias no se imprimen. Si especifica --disable-stdcall-fixup, esta característica es deshabilitada y dichas discrepancias se consideran errores. [Esta opción es específica del puerto específico del enlazador i386 PE]

+0

Acabo de intentar con esto: '" C: \ Progra ~ 1 \ MySQL \ MySQLS ~ 1.5 \ lib \ libmysql.dll "' y obtuve lo siguiente en su lugar (advertencias, pero al menos se vincula!) .. .' Advertencia: resolver _mysql_init @ 4 al enlazar a _mysql_init Use --enable-stdcall-fixup para deshabilitar estas advertencias Use --disable-stdcall-fixup para deshabilitar estas reparaciones' ¿Alguna idea al respecto? ¿Debo usar otra opción de enlazador, o estoy listo para ir? – Gaffi

+0

@ Gaffi - Ver la actualización de mi respuesta. – Lumi

0

hicieron intenta -lmysql como el enlazador antepone automáticamente lib y anexa .lib

+0

Solo lo intenté, sin suerte. (pregunta de actualización) – Gaffi

Cuestiones relacionadas