2010-12-08 74 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