如何在OS X上正确创建C ++目标文件(.o)?

时间:2018-08-06 21:31:08

标签: java c++ java-native-interface

我是一位Java开发人员,几乎没有本机编码经验,所以我想创建我的第一个Java-Native-Interface演示。我正在尝试以与this example相同的方式使用Kotlin和C ++。我正在OS X上进行开发。

我陷入了从我的c ++文件编译动态库(.so文件)的步骤中。

jni/文件夹中要启动的2个文件是:

  • matt_extend_NativeTest.h
  • matt_extend_NativeTestImp.cpp

我试图建立.so文件的步骤是:

1。 g++ -g jni/matt_extend_NativeTest.h -I "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/include" -I "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/include/darwin" -o jni/matt_extend_NativeTest.o

  • 这会生成 matt_extend_NativeTest.o

2。 g++ -g -I "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/include" -I "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/include/linux" -shared -o jni/libnativetest.so jni/matt_extend_NativeTest.o

  • 这会生成 libnativetest.so ,但我收到警告:

ld: warning: ignoring file jni/matt_extend_NativeTest.o, file was built for unsupported file format ( 0x43 0x50 0x43 0x48 0x01 0x08 0x00 0x00 0xAE 0x0A 0x00 0x00 0x07 0xC1 0xB3 0xD0 ) which is not the architecture being linked (x86_64): jni/matt_extend_NativeTest.o

在步骤1中生成.o文件的正确方法是什么,以便在步骤2中不会收到警告?

1 个答案:

答案 0 :(得分:2)

第一个命令有两个错误:

  1. 在编译jni/matt_extend_NativeTestImp.cpp文件而不是.cpp

  2. 时,请使用.h而不是-c
  3. 对编译器使用附加的-fpic标志,以便它生成目标文件(而不是可执行文件)

注意:您可能还需要使用jobs选项(以生成与位置无关的代码)。

(使用当前错误的选项,g ++会生成预编译的头文件而不是目标文件)