使用MacOS 10.3.9对PPC G3进行交叉编译

gub*_*bby 2 java macos java-native-interface g++

我正在编写一个程序来与USB硬件接口板通信,这需要一个小型JNI库.我在编译机器上运行10.5.8,并且可以使用以下命令成功编译JNI的共享库:

# 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
Run Code Online (Sandbox Code Playgroud)

我真的不明白我在这里做什么; 我已经设法从很多谷歌搜索中拼凑出来.我的问题是:我如何修改它来编译运行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
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用System.load()时,我从Java(1.5)程序中得到以下错误:

dyld: java bad CPU subtype in library: /libk8055usbio.dylib
Trace/BPT trap
Run Code Online (Sandbox Code Playgroud)

我不知道如何修复它,我应该指定什么CPU子类型?

Ted*_*rek 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
Run Code Online (Sandbox Code Playgroud)

您可以使用标准检查标题中的CPU类型/子类型,otool -h本示例为我提供:

$ otool -h testprogtestprog:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedface      18          0  0x00          2    11       1268 0x00000085
Run Code Online (Sandbox Code Playgroud)

根据/Developer/SDKs/MacOSX10.4u.sdk/usr/include/mach/machine.h,零为CPU_SUBTYPE_POWERPC_ALL.

  • 通过添加`-arch i386`以及`-arch ppc`和10.4u SDK,你应该得到一个通用的二进制文件,它可能适用于运行OS X 10.3.9到目前的10.6的任何Mac. (2认同)
  • 您也可以使用`otool -hv`(或`-hV`)为您解码大部分字段. (2认同)