Making a 64 bit shared library that dynamically links to a 32 bit library on Mac OS X Snow Leopard
更新:更多阅读后,我看到这个问题是完全普遍的,您不能在同一过程中混合使用体系结构,因此64位Java不能
我需要在Max OS X上制作一个64位的dylib,因为Java Native Access只喜欢64位计算机上的64位库。问题是,我的C源代码动态包含FMOD,在Mac上仅提供32位dylib。当我尝试不使用-m32选项进行编译时(由于必须输出64位dylib),出现以下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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位库并通过某种IPC机制公开其功能的32位"帮助程序"进程,另一个是链接到您自己的64位库的64位Java进程。铅>
您的64位库启动了帮助程序,并提供了一组功能,该功能通过将请求通过IPC机制传递给帮助程序并返回结果来实现。 IPC就像使用
64位二进制文??件不能链接到32位二进制文??件,反之亦然。如果无法使用32位元获得所需的库,最好的解决方案是创建一个由主程序控制的32位代理程序。这就是Safari在10.6中执行Flash的方式-Flash插件在其自己的地址空间中运行。
对于那些偶然发现此问题的人来说,这只是FYI,FMOD的开发版本包含适用于Mac OS X的64位dylib。我现在正在使用它,并且我敢肯定它将被移植到主要版本中。 API的第几行。