2010-12-08 39 views
2

我正在編寫一個程序與USB硬件接口板交談,這需要一個小的JNI庫。我是我的編譯機器上運行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機器?我很滿意的Java部分。以下是我試過到目前爲止:

# 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(),我從Java(1.5)程序得到以下錯誤:

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

我不知道如何解決它,我應該指定什麼樣的CPU子類型?

回答

5

你需要擺弄幾個選項。首先,您需要使用-isysroot明確指定SDK,因爲較新的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 i386`以及`-arch ppc`和10.4u SDK,您最終將得到一個通用二進制文件,該文件很可能在任何運行OS X 10.3.9的Mac上通過目前10.6。 – 2010-12-08 18:56:38