如何在OSX上正确创建C++对象文件(.o)



我是一名Java开发人员,几乎没有本地编程经验,我想创建我的第一个Java native Interface演示。我正在尝试使用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.所以,但我收到警告:

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. 使用jni/matt_extend_NativeTestImp.cpp而不是jni/matt_extend_NativeTest.h,因为我们编译的是.cpp文件,而非.h

  2. 对编译器使用额外的-c标志,这样它就生成了一个对象文件(而不是可执行文件(

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

(使用当前错误的选项,g++生成一个预编译的头文件,而不是对象文件(

最新更新