Создание 64-битной разделяемой библиотеки, которая динамически связывается с 32-битной библиотекой в ​​Mac OS X Snow Leopard - PullRequest
1 голос
/ 10 марта 2010

Обновление: после некоторого прочтения я вижу, что эта проблема носит общий характер, вы не можете смешивать архитектуры в одном и том же процессе, поэтому 64-битная Java не может dlopen() 32-битная библиотека, как FMOD. Есть ли возможный обходной путь для этого, учитывая, что я пишу свой собственный C-интерфейс в библиотеку FMOD?

Мне нужно сделать 64-битный dylib на Max OS X , потому что Java Native Access любит только 64-битные библиотеки на 64-битных машинах. Проблема в том, что мой исходный код на C динамически включает в себя FMOD, который на Mac предоставляет только 32-битные библиотеки. Когда я пытаюсь скомпилировать без опции -m32 (поскольку я должен вывести 64-битный dylib), я получаю следующую ошибку:

    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

Разве нельзя получить 64-битный dylib из моего исходного кода, который динамически включает в себя 32-битные библиотеки?!

Ответы [ 3 ]

6 голосов
/ 10 марта 2010

Как вы заметили, вы не можете смешивать архитектуры в одном процессе.

Обходной путь должен иметь два процесса. Один из них - это 32-битный «вспомогательный» процесс, который связывается с 32-битной библиотекой и предоставляет свои функции через некоторый механизм IPC, а другой - 64-битный процесс Java, связанный с вашей собственной 64-битной библиотекой.

Ваша 64-битная библиотека запускает вспомогательный процесс и предоставляет набор функций, которые она реализует, передавая запросы вспомогательному процессу через механизм IPC и возвращая результаты. IPC может быть простым, как пара анонимных каналов, созданных с помощью системного вызова pipe().

2 голосов
/ 10 марта 2010

64-битные двоичные файлы не могут связываться с 32-битными или наоборот. Если вы не можете получить нужную библиотеку в 32-разрядной версии, лучшим решением будет создание 32-разрядной прокси-программы, которой будет управлять ваша основная программа. Вот как Safari делает Flash в 10.6 - плагин Flash работает в своем собственном адресном пространстве.

1 голос
/ 10 марта 2010

Просто к сведению тех, кто сталкивается с этим, в разрабатываемом выпуске FMOD есть 64-битная библиотека для Mac OS X . Я использую это сейчас, и я уверен, что он скоро будет перемещен в основную строку API.

...