在Mac OS X Snow Leopard上创建一个动态链接到32位库的64位共享库
更新:经过更多的阅读,我发现这个问题非常普遍,不能在同一个过程中混合使用体系结构,因此64位Java不能在Mac OS X Snow Leopard上创建一个动态链接到32位库的64位共享库,c,macos,64-bit,shared-libraries,dylib,C,Macos,64 Bit,Shared Libraries,Dylib,更新:经过更多的阅读,我发现这个问题非常普遍,不能在同一个过程中混合使用体系结构,因此64位Java不能dlopen()像FMOD这样的32位库。请记住,我正在为FMOD库编写自己的C接口,是否有任何可能的解决方法 我需要在上创建一个64位动态库,因为Java Native Access只喜欢64位机器上的64位库。问题是,我的C源代码动态地包含FMOD,它在Mac上只提供32位DYLIB。当我尝试在没有-m32选项的情况下编译时(因为我必须输出64位动态库),我得到以下错误: gcc
dlopen()
像FMOD这样的32位库。请记住,我正在为FMOD库编写自己的C接口,是否有任何可能的解决方法
我需要在上创建一个64位动态库,因为Java Native Access只喜欢64位机器上的64位库。问题是,我的C源代码动态地包含FMOD,它在Mac上只提供32位DYLIB。当我尝试在没有-m32选项的情况下编译时(因为我必须输出64位动态库),我得到以下错误:
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位动态库吗 正如您所指出的,您不能在同一个过程中混合使用体系结构 解决方法是有两个过程。其中一个是链接到32位库并通过某些IPC机制公开其功能的32位“助手”进程,另一个是链接到您自己的64位库的64位Java进程
您的64位库启动helper进程,并提供一组函数,它通过IPC机制将请求传递给helper进程并返回结果来实现这些函数。IPC可以像使用
pipe()
系统调用创建的一对匿名管道一样简单。如您所述,不能在同一过程中混合使用体系结构
解决方法是有两个过程。其中一个是链接到32位库并通过某些IPC机制公开其功能的32位“助手”进程,另一个是链接到您自己的64位库的64位Java进程
您的64位库启动helper进程,并提供一组函数,它通过IPC机制将请求传递给helper进程并返回结果来实现这些函数。IPC可以像使用
pipe()
系统调用创建的一对匿名管道一样简单。64位二进制文件不能链接到32位二进制文件,反之亦然。如果您无法以32位格式获取所需的库,那么最好的解决方案是创建一个由主程序控制的32位代理程序。Safari在10.6中就是这样运行Flash的——Flash插件在自己的地址空间中运行。64位二进制文件不能链接到32位二进制文件,反之亦然。如果您无法以32位格式获取所需的库,那么最好的解决方案是创建一个由主程序控制的32位代理程序。这就是Safari在10.6中使用Flash的方式-Flash插件在自己的地址空间中运行。对于任何偶然发现这一点的人来说,仅供参考,FMOD的开发版本包含一个64位动态库。我现在正在使用它,我相信它很快就会进入API的主线。对于任何偶然发现这一点的人来说,仅供参考,FMOD的开发版本包含一个64位的动态库。我现在正在使用它,我相信它很快就会进入API的主线