2010-03-09 49 views
1

更新:經過一些閱讀後,我發現這個問題是完全一般的,你不能在同一個進程中混合架構,所以64位Java不能像dlopen()這樣的32位庫像FMOD。是否有任何可能的解決方法,請記住我正在爲FMOD庫編寫我自己的C接口?製作64位共享庫,動態鏈接到Mac OS X上的32位庫雪豹

我需要在Max OS X上創建64位dylib,因爲Java本機訪問只喜歡64位機器上的64位庫。問題是,我的C源代碼動態地包含了FMOD,它在Mac上只提供32位dylib。當我嘗試沒有-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位庫?

回答

6

正如你所指出的,你不能在同一個過程中混合架構。

解決方法是,然後有兩個進程。其中之一是一個32位的「幫助程序」過程,它鏈接到32位庫並通過某種IPC機制公開其功能,另一個是64位Java過程鏈接到您自己的64位庫。

您的64位庫啓動輔助進程,並提供一組函數,它通過將請求傳遞給輔助進程通過IPC機制並返回結果來實現。 IPC可以像使用pipe()系統調用創建的一對匿名管道一樣簡單。

2

64位二進制文​​件無法鏈接到32位或反之亦然。如果你無法獲得32位的庫,那麼最好的解決方案是創建一個32位的代理程序,並由你的主程序控制。這就是Safari在10.6版Flash中的作用 - Flash插件在自己的地址空間中運行。

1

對於任何人而言,FMOD的開發版本包含一個用於Mac OS X的64位dylib。我現在正在使用它,並且我確信它很快就會被移入API的主線。