【问题标题】:JNI build C file (Undefined symbols for architecture x86_64)JNI 构建 C 文件(架构 x86_64 的未定义符号)
【发布时间】:2016-08-07 03:52:22
【问题描述】:

我正在尝试在 OSX 上构建一个 .c 文件,但我不断收到:

Undefined symbols for architecture x86_64

#include "Test.h"  

JNIEXPORT jint JNICALL Java_Test_test
  (JNIEnv * env, jclass cls, jbyteArray s, jlong ss, jbyteArray sss, jlong ssss, jbyteArray sssss, jlong ssssss) {

  /*printf("Hello World!\n");*/
  return 1;
}

内置:

clang++ -o test -I/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/include  -I/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/include/darwin Test.cpp

Undefined symbols for architecture x86_64:   "_main", referenced from:
     implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

有什么我需要安装的吗?

【问题讨论】:

    标签: macos build java-native-interface linker-errors x86-64


    【解决方案1】:

    clang++ -o test Test.cpp 正在尝试编译并链接以生成可运行的可执行文件。你没有定义main(),所以当它尝试链接CRT代码时当然会失败(它调用用户提供的main()。)

    也许您打算使用clang++ -fPIC -shared -o libtest.so Test.cpp -I...(保持所有其他选项相同)来制作像 JNI 需要的共享库。或.dylib.jnilib,无论您的平台上通常调用什么库。

    如果您学习的教程没有告诉您如何编译代码,那么它可能不是一个很好的教程,您应该找到更好的文档。

    【讨论】:

    • 可能不是正确的答案,因为 JNI 模块是一个共享对象,而您将生成一个直接的对象文件。
    • @MichaelPetch:嗯,没错,这很有道理。 -fPIC -shared 应该是正确的,IIRC。
    • OP 说 OSX,所以它可能应该是 .dylib.jnilib (我会给文件一个 lib 前缀,现在命令不是缺少 -o 吗? )
    • @user2543253:谢谢。这是一个非常懒惰的答案;我可能应该刚刚发表评论,因为我不想努力写一个好的答案。 >.
    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多