【问题标题】:Making a 64 bit shared library that dynamically links to a 32 bit library on Mac OS X Snow Leopard在 Mac OS X Snow Leopard 上制作一个动态链接到 32 位库的 64 位共享库
【发布时间】:2010-03-09 22:01:42
【问题描述】:

更新:经过更多阅读,我发现这个问题是完全一般的,你不能在同一个进程中混合架构,所以 64 位 Java 不能dlopen() 像 FMOD 这样的 32 位库。是否有任何可能的解决方法,请记住我正在为 FMOD 库编写自己的 C 接口?

我需要在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 吗?!

【问题讨论】:

    标签: c macos 64-bit shared-libraries dylib


    【解决方案1】:

    正如您所指出的,您不能在同一流程中混合架构。

    解决方法是使用 两个 进程。其中一个是32位“helper”进程,它链接到32位库并通过某种IPC机制暴露其功能,另一个是链接到你自己的64位库的64位Java进程。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        对于任何偶然发现这一点的人来说,仅供参考,FMOD 的开发版本包含一个用于Mac OS X 的 64 位 dylib。我现在正在使用它,我相信它很快就会被移到 API 的主线中。

        【讨论】:

          猜你喜欢
          • 2012-10-17
          • 2015-09-28
          • 2010-12-15
          • 1970-01-01
          • 2014-08-23
          • 1970-01-01
          • 2012-01-13
          • 1970-01-01
          • 2021-12-22
          相关资源
          最近更新 更多