Realización de una biblioteca compartida de 64 bits que vincula dinámicamente a una biblioteca de 32 bits en Mac OS X Snow Leopard

StackOverflow https://stackoverflow.com/questions/2412893

Pregunta

Actualización: Después de leer un poco más veo que este problema es totalmente generales, no se pueden mezclar las arquitecturas en el mismo proceso, de modo 64 bits Java no puede dlopen() una biblioteca de 32 bits como FMOD. ¿Hay alguna posible solución para esto, teniendo en cuenta que estoy escribiendo mi propia interfaz de C a la biblioteca FMOD?

Necesito hacer una dylib de 64 bits en Max OS X porque Java Native Access sólo le gustan las bibliotecas de 64 bits en equipos de 64 bits. El problema es que mi código fuente en C incluye dinámicamente FMOD en Mac, que sólo proporciona dylibs de 32 bits. Cuando intento compilar sin la opción -m32 (ya que debe emitir una dylib 64 bits) me sale el siguiente error:

    gcc -dynamiclib -std=c99 -pedantic -Wall -O3 -fPIC -pthread -o  ../bin/libpenntotalrecall_fmod.dylib ../../src/libpenntotalrecall_fmod.c -lfmodex -L../../lib/osx/

    ld: warning: in /usr/lib/libfmodex.dylib, missing required architecture x86_64 in file
    Undefined symbols:
      "_FMOD_System_CreateSound", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_Channel_GetPosition", referenced from:
          _streamPosition in ccJnlwrd.o
      "_FMOD_System_Create", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_System_PlaySound", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_Sound_Release", referenced from:
          _stopPlayback in ccJnlwrd.o
      "_FMOD_Channel_IsPlaying", referenced from:
          _playbackInProgress in ccJnlwrd.o
      "_FMOD_System_Update", referenced from:
          _streamPosition in ccJnlwrd.o
          _startPlayback in ccJnlwrd.o
      "_FMOD_Channel_SetPaused", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_System_Release", referenced from:
          _stopPlayback in ccJnlwrd.o
      "_FMOD_System_Init", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_Channel_SetVolume", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_System_Close", referenced from:
          _stopPlayback in ccJnlwrd.o
      "_FMOD_Channel_SetCallback", referenced from:
          _startPlayback in ccJnlwrd.o
    ld: symbol(s) not found
    collect2: ld returned 1 exit status
    make: *** [all] Error 1

¿No debería ser posible obtener una dylib 64 bits de mi código fuente que incluye de forma dinámica las bibliotecas de 32 bits?!

¿Fue útil?

Solución

Como se ha señalado, no se puede mezclar arquitecturas en el mismo proceso.

La solución es entonces tener dos procesos. Uno de ellos es un proceso de 32 bits "ayudante" que une a la biblioteca de 32 bits y expone sus funciones a través de algún mecanismo IPC, y el otro es el proceso de Java de 64 bits relacionado con su propia biblioteca de 64 bits.

Su biblioteca de 64 bits se pone en marcha el proceso de ayuda, y proporciona un conjunto de funciones que implementa pasando peticiones al proceso de ayuda sobre el mecanismo IPC y devolver los resultados. El IPC puede ser tan simple como un par de tubos anónimos creados con la llamada al sistema pipe().

Otros consejos

binarios de 64 bits no pueden enlazar con los 32 bits o vice-versa. Si no se puede obtener la biblioteca que desee en 32 bits, la mejor solución es crear un programa de proxy de 32 bits que sus principales controles del programa. Así es como Safari hace Flash 10.6 -. El plugin de Flash se ejecuta en su propio espacio de direcciones

Como digo a cualquier persona que se topa con esto, versión de desarrollo de FMOD contiene una dylib 64 bits para Mac OS X . Estoy usando ahora, y estoy seguro de que va a ser movido en la línea principal de la API pronto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top