Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mac OS X Snow Leopard上创建一个动态链接到32位库的64位共享库_C_Macos_64 Bit_Shared Libraries_Dylib - Fatal编程技术网

在Mac OS X Snow Leopard上创建一个动态链接到32位库的64位共享库

在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

更新:经过更多的阅读,我发现这个问题非常普遍,不能在同一个过程中混合使用体系结构,因此64位Java不能
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的主线