2010-12-08 2 views
2

작은 JNI 라이브러리가 필요한 USB 하드웨어 인터페이스 보드와 통신하기위한 프로그램을 작성 중입니다. 내가 컴파일 시스템에 10.5.8를 실행하고, 그리고 성공적으로 다음 명령을 JNI를 위해 공유 라이브러리를 컴파일 할 수MacOS에서 PPC G3에 대한 크로스 컴파일 10.3.9

# Build shared library for K8055 
g++ -x objective-c -fmessage-length=0 -pipe -Wno-trigraphs \ 
    -fpascal-strings -fasm-blocks -O0 -mdynamic-no-pic -fvisibility=hidden -gdwarf-2 \ 
    -Wmost -Wno-four-char-constants -Wno-unknown-pragmas \ 
    -c ./K8055/K8055.m \ 
    -o ./K8055/K8055.o \ 
    -arch x86_64 \ 
    -arch i386 

echo "Building JNI shared library..." 
gcc -c -m64 -I/System/Library/Frameworks/JavaVM.framework/Headers \ 
    k8055usbio.m -o k8055usbio.so -arch x86_64 

echo "Compiling dynamic library with both..." 
g++ -m64 -dynamiclib -o ./lib/libk8055usbio.dylib \ 
    k8055usbio.so ./K8055/K8055.o\ 
    -framework Foundation -framework IOKit 

난 정말 내가 여기서 뭘하는지 이해하지 않는다; 나는 많은 인터넷 검색에서 그걸 함께 모을 수 있었다. 내 질문은 : 어떻게 10.3.9를 실행하는 PPC G3 컴퓨터에 대해 컴파일하려면이 수정해야합니까? 내가 좋아하는 자바 부분. 여기에 지금까지 시도한 것입니다 :

dyld: java bad CPU subtype in library: /libk8055usbio.dylib 
Trace/BPT trap 

I :

# Build shared library for K8055 (PPC) 
echo "Building driver shared library..." 
g++ -x objective-c -fmessage-length=0 -pipe -Wno-trigraphs \ 
    -fpascal-strings -fasm-blocks -O0 -mdynamic-no-pic -fvisibility=hidden -gdwarf-2 \ 
    -Wmost -Wno-four-char-constants -Wno-unknown-pragmas \ 
    -c ./K8055/K8055.m \ 
    -o ./K8055/K8055.o \ 
    -arch ppc 

echo "Building JNI shared library..." 
gcc -c -I/System/Library/Frameworks/JavaVM.framework/Headers \ 
    k8055usbio.m -o k8055usbio.so -arch ppc 

echo "Compiling dynamic library with both..." 
gcc -shared -fPIC -o ./lib/libk8055usbio.dylib k8055usbio.so \ 
    ./K8055/K8055.o -framework Foundation -framework IOKit -arch ppc 

을하지만 System.load()가, 내가 자바 (1.5) 프로그램에서 다음과 같은 오류가 발생하려고 할 때 그것을 고치는 방법을 모르는 어떤 CPU 하위 유형을 지정해야합니까?

답변

5

두 가지 옵션이 필요합니다. 먼저, 새로운 SDK가 다양한 방법으로 당신을 파괴 할 것이므로, -isysroot를 사용하여 명시 적으로 SDK를 지정하고자 할 것입니다. 둘째로, -mmacosx-version-min = 10.3을 전달하여 실제로 10.3에서 실행하기를 원할 것입니다. 작은 테스트 프로그램에서이 두 옵션을 모두 사용하면 G3에서 실행해야한다고 주장하는 바이너리를 얻습니다. 여기 내 명령 줄입니다 :

gcc-4.0 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk/ -mmacosx-version-min=10.3 -o testprog testarch.c 

당신이 예를 들어 저를 제공 otool -h를 사용하여 헤더의 CPU 유형/하위 유형을 확인 정신 수 있습니다

$ otool -h testprogtestprog: 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
0xfeedface  18   0 0x00   2 11  1268 0x00000085 

CPU_SUBTYPE_POWERPC_ALL가/개발자 당이 제로 /SDKs/MacOSX10.4u.sdk/usr/include/mach/machine.h.

+2

'-arch ppc'과 10.4u SDK와 함께'-arch i386'을 추가하면, OS X 10.3.9를 실행하는 모든 Mac에서 작동 할 수있는 유니버설 바이너리로 끝납니다. 현재 10.6. –

+2

또한'otool -hv' (또는'-hV')를 사용하여 대부분의 필드를 디코드 할 수 있습니다. –

+1

허, 분명히 -v에 대해 잊어 버렸습니다. 감사! –