制作一个64位共享库,动态链接到Mac OS X Snow Leopard上的32位库

更新:经过一些阅读后,我发现这个问题非常普遍,你不能在同一个过程中混合架构,所以64位Java不能dlopen()像FMOD这样的32位库。 有没有可能的解决方法,请记住我正在编写自己的COD接口到FMOD库?

我需要在Max OS X上创建64位dylib,因为Java Native Access只喜欢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 

不应该从我的动态包含32位库的源代码中获取64位dylib吗?!

正如您所指出的,您无法在同一过程中混合体系结构。

然后,解决方法是有两个进程。 其中一个是32位“辅助”进程,它链接到32位库并通过某种IPC机制公开其function,另一个是链接到您自己的64位库的64位Java进程。

您的64位库启动帮助程序进程,并通过IPC机制将请求传递给辅助进程并返回结果来提供它实现的一组函数。 IPC可以像使用pipe()系统调用创建的一对匿名管道一样简单。

64位二进制文​​件无法链接到32位二进制文​​件,反之亦然。 如果您无法获得所需的32位库,则最佳解决方案是创建主程序控制的32位代理程序。 这就是Safari在10.6中执行Flash的方式 – Flash插件在自己的地址空间中运行。

对于遇到这种情况的任何人来说,只是一个FYI,FMOD的开发版本包含适用于Mac OS X的64位dylib。 我现在正在使用它,我相信它很快就会被移到API的主线上。