2010-03-09 2 views
1

업데이트 :이 문제는 완전히 일반적인 것이므로 동일한 프로세스에서 아키텍처를 혼합 할 수 없습니다. 64 비트 자바는 FMOD와 같은 32 비트 라이브러리 dlopen()을 사용할 수 없습니다. FMOD 라이브러리에 내 자신의 C 인터페이스를 쓰고 있음을 염두에 두면서 가능한 해결책이 있습니까?Mac OS X Snow Leopard에서 32 비트 라이브러리에 동적으로 링크되는 64 비트 공유 라이브러리 만들기

Java Native Access는 64 비트 시스템에서만 64 비트 라이브러리 만 좋아하기 때문에 Max OS X에서 64 비트 dylib를 만들어야합니다. 문제는 내 C 소스 코드가 Mac에서 32 비트 dylib 만 제공하는 FMOD를 동적으로 포함한다는 것입니다. 나는 -m32 옵션없이 컴파일 할 때 (이후 출력해야 64 비트 dylib) 나는 다음과 같은 오류 얻을 : 내 소스 코드에서 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 비트 라이브러리를 포함합니까?!

답변

6

앞서 언급 한 것처럼 동일한 프로세스에서 아키텍처를 혼합 할 수 없습니다.

이 문제를 해결하려면 두 프로세스이 있어야합니다. 그들 중 하나는 32 비트 라이브러리에 연결하고 일부 IPC 메커니즘을 통해 그 기능을 공개하는 32 비트 "도우미"프로세스와 사용자의 64 비트 라이브러리에 연결된 64 비트 Java 프로세스입니다.

64 비트 라이브러리는 도우미 프로세스를 시작하고 IPC 메커니즘을 통해 도우미 프로세스에 요청을 전달하고 결과를 반환함으로써 구현되는 일련의 기능을 제공합니다. IPC는 pipe() 시스템 호출로 생성 된 익명 파이프 쌍처럼 간단 할 수 있습니다.

2

64 비트 바이너리는 32 비트 바이너리로 링크 할 수 없으며 그 반대의 경우도 마찬가지입니다. 32 비트에서 원하는 라이브러리를 가져올 수없는 경우 주 프로그램이 제어하는 ​​32 비트 프록시 프로그램을 만드는 것이 가장 좋습니다. 이것은 Safari가 10.6에서 Flash를 수행하는 방식입니다. Flash 플러그인은 자체 주소 공간에서 실행됩니다.

1

FMOD의 개발 릴리스에는 Mac OS X에 대한 64 비트 dylib가 포함되어 있습니다. 저는 지금 그것을 사용하고 있으며 곧 API의 메인 라인으로 옮겨 질 것이라고 확신합니다.

관련 문제