Consiguiendo 'referencia no definida' usando mingw32, pero sin error de enlace usando mingw64, ¿por qué?

Estoy tratando de compilar los ejemplos para la API de LeapMotion utilizando mingw en cygwin

Cuando compilo con mingw64, funciona bien:

x86_64-w64-mingw32-g++ -s -I ../include -L ../lib/x64/ ExampleConnection.cpp -lLeapC PollingSample.cpp -oPollingSample

pero si cambio a 32 bits:

i686-w64-mingw32-g++ -s -I ../include -L ../lib/x86/ ExampleConnection.cpp -lLeapC PollingSample.cpp -oPollingSample

Entiendo:

/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x31): undefined reference to `LeapCreateConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x52): undefined reference to `LeapOpenConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0xb5): undefined reference to `LeapCloseConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0xe7): undefined reference to `LeapDestroyConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0xfd): undefined reference to `LeapDestroyConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x16a): undefined reference to `LeapOpenDevice'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x1d2): undefined reference to `LeapGetDeviceInfo'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x205): undefined reference to `LeapGetDeviceInfo'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x26d): undefined reference to `LeapCloseDevice'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x4ac): undefined reference to `LeapPollConnection'
collect2: error: ld returned 1 exit status

Traté de cambiar la posición de -lLeapC en la cadena de comandos, e invertir el orden de archivos .cpp, pero siempre consigo el mismo error.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por compilercaptain


3 Respuestas:

  • Resolví el problema con la conversión de LeapC.lib a LeapC.a en /lib/x86/ (y la eliminación de LeapC.lib de la carpeta)

    gendef LeapC.dll //this generates LeapC.def
    i686-w64-mingw32-dlltool.exe --def LeapC.def --dllname LeapC.dll --output-lib LeapC.a
    

    Respondida el Dec 18, 2020 a las 16:03 - por devgeek

    Votos positivos: 0 | Votos negativos: 0

  • Este error de "referencia no definida" suele ocurrir cuando el enlazador no puede encontrar las definiciones de las funciones que estás utilizando en tu código, en este caso las funciones de la API de LeapMotion.

    Si el problema ocurre al compilar con mingw32 pero no con mingw64, puede deberse a diferencias en cómo se vinculan las bibliotecas y cómo se manejan las rutas de búsqueda de bibliotecas en los dos entornos.

    Aquí hay algunas sugerencias para intentar solucionar el problema:

    • Asegúrate de que estás utilizando las bibliotecas correctas para la versión de 32 bits de mingw. Verifica que las bibliotecas en `../lib/x86/` estén compiladas para la arquitectura de 32 bits y sean compatibles con mingw32.
    • Intenta ajustar las opciones de enlazado para especificar la ruta de búsqueda de bibliotecas de forma explícita, utilizando la opción `-L` seguida de la ruta completa a las bibliotecas de LeapMotion.
    • Asegúrate de incluir las bibliotecas necesarias en el orden correcto en tu comando de compilación. Normalmente, las bibliotecas se deben especificar después de los archivos fuente en el comando de compilación.
    • Si sigues experimentando problemas, también podrías intentar revisar si hay diferencias en las opciones de compilación por defecto entre mingw32 y mingw64 que podrían estar afectando el proceso de enlazado.

    Intenta aplicar estas sugerencias y verifica si puedes solucionar el problema de la "referencia no definida" al compilar con mingw32.

    Respondida el Dec 19, 2020 a las 16:04 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error "referencia no definida" al utilizar mingw32 pero no mingw64 indica que la biblioteca compartida para la API de LeapMotion no está enlazando correctamente con el código. Aquí tienes algunas posibles razones y soluciones:

    1. Versión incorrecta de la biblioteca compartida:

    Asegúrate de utilizar la versión correcta de la biblioteca compartida de LeapMotion para la arquitectura de 32 bits (i686-w64-mingw32).

    2. Ruta de la biblioteca compartida incorrecta:

    Verifica que la ruta especificada en -L ../lib/x86/ sea correcta y que contenga la biblioteca compartida de LeapMotion para la arquitectura de 32 bits.

    3. Orden de vinculación incorrecto:

    La opción -lLeapC debe colocarse después de los archivos .cpp en la línea de comandos. Esto asegura que el enlazador resuelva las referencias a las funciones de la biblioteca compartida después de que se haya leído el código.

    4. Biblioteca compartida no estática:

    La biblioteca compartida de LeapMotion no está marcada como estática, lo que significa que el enlazador no la incrustará en el ejecutable. Intenta utilizar la opción -static en la línea de comandos para forzar la vinculación estática.

    5. Dependencias faltantes:

    La biblioteca compartida de LeapMotion puede depender de otras bibliotecas compartidas. Asegúrate de que estas dependencias también estén disponibles e incluidas en la ruta de búsqueda del enlazador.

    Posible línea de comandos corregida:

    
    i686-w64-mingw32-g++ -s -I ../include -L ../lib/x86 ExampleConnection.cpp PollingSample.cpp -lLeapC -static -oPollingSample
    

    Si ninguna de estas soluciones funciona, intenta lo siguiente:

    Actualiza el compilador mingw32 a la última versión. Vuelve a instalar la API de LeapMotion y asegúrate de que se ha instalado correctamente para la arquitectura de 32 bits. Consulta la documentación de la API de LeapMotion para obtener instrucciones y depuración adicionales.

    Respondida el Dec 19, 2020 a las 16:12 - por Gemini

    Votos positivos: 0 | Votos negativos: 0