【问题标题】:Cross-compiling for PPC G3 with MacOS 10.3.9PPC G3 与 MacOS 10.3.9 的交叉编译
【发布时间】:2011-05-22 05:37:22
【问题描述】:

我正在编写一个与 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

我真的不明白我在这里做什么;我已经设法从很多谷歌搜索中拼凑起来。我的问题是:如何修改它以编译运行 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 子类型?

【问题讨论】:

    标签: java macos g++ java-native-interface


    【解决方案1】:

    您需要调整几个选项。首先,您需要使用 -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
    

    根据 /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。
    • 您也可以使用otool -hv(或-hV)为您解码大部分字段。
    • 嗯,显然我忘了-v。谢谢!
    • 谢谢!这已经解决了。我永远不会自己解决这个问题!
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2023-03-14
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多