关于C#:制作一个64位共享库,该库动态链接到Mac OS X Snow Leopard上的32位库

Making a 64 bit shared library that dynamically links to a 32 bit library on Mac OS X Snow Leopard

更新:更多阅读后,我看到这个问题是完全普遍的,您不能在同一过程中混合使用体系结构,因此64位Java不能dlopen() 32位库(如FMOD)。请记住,我正在为FMOD库编写我自己的C接口吗?

我需要在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就像使用pipe()系统调用创建的一对匿名管道一样简单。


64位二进制文??件不能链接到32位二进制文??件,反之亦然。如果无法使用32位元获得所需的库,最好的解决方案是创建一个由主程序控制的32位代理程序。这就是Safari在10.6中执行Flash的方式-Flash插件在其自己的地址空间中运行。


对于那些偶然发现此问题的人来说,这只是FYI,FMOD的开发版本包含适用于Mac OS X的64位dylib。我现在正在使用它,并且我敢肯定它将被移植到主要版本中。 API的第几行。