• 如何解决用CMake未定义引用`JNI_CreateJavaVM'?


    我需要从C ++运行Java,一般来说问题已经解决,但我的make系统或脚本出了问题,有一个创建JVM的C ++文件:

    #include <jni.h>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        JavaVMOption jvmopt[1];
        jvmopt[0].optionString = const_cast<char *>("-Djava.class.path=.");
    
        JavaVMInitArgs vmArgs;
        vmArgs.version = JNI_VERSION_1_2;
        vmArgs.nOptions = 1;
        vmArgs.options = jvmopt;
        vmArgs.ignoreUnrecognized = JNI_TRUE;
    
        // Create the JVM
        JavaVM *javaVM;
        JNIEnv *jniEnv;
        long flag = JNI_CreateJavaVM(&javaVM, (void **)
                &jniEnv, &vmArgs);
    
        return 0;
    }

    有一个CMakeLists.txt文件:

    cmake_minimum_required(VERSION 3.12)
    project(games_test_system)
    
    include_directories(/usr/java/jdk-10.0.2/include /usr/java/jdk-10.0.2/include/linux)
    link_directories(/usr/java/jdk-10.0.2/lib /usr/java/jdk-10.0.2/lib/server)
    
    set(CMAKE_CXX_STANDARD 14)
    
    add_executable(games_test_system main.cpp)

    运行它:

    /opt/clion-2018.2.2/bin/cmake/linux/bin/cmake --build /home/obabichev/CLionProjects/games-test-system/cmake-build-debug --target games_test_system -- -j 4

    得到这个错误:

    [ 50%] Linking CXX executable games_test_system
    CMakeFiles/games_test_system.dir/main.cpp.o: In function `main':
    /home/obabichev/CLionProjects/games-test-system/main.cpp:21: undefined reference to `JNI_CreateJavaVM'
    collect2: error: ld returned 1 exit status
    CMakeFiles/games_test_system.dir/build.make:83: recipe for target 'games_test_system' failed
    make[3]: *** [games_test_system] Error 1
    CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/games_test_system.dir/all' failed
    make[2]: *** [CMakeFiles/games_test_system.dir/all] Error 2
    CMakeFiles/Makefile2:84: recipe for target 'CMakeFiles/games_test_system.dir/rule' failed
    make[1]: *** [CMakeFiles/games_test_system.dir/rule] Error 2
    Makefile:118: recipe for target 'games_test_system' failed
    make: *** [games_test_system] Error 2

    回答:

    CMakeLists.txt文件中,添加

    find_package(JNI REQUIRED)
    target_link_libraries(games_test_system ${JNI_LIBRARIES})

    而不是手动选择目录也可以依赖CMake

    include_directories(${JNI_INCLUDE_DIRS}
  • 相关阅读:
    C++学习 之 继承(笔记)
    C++学习 之 类中的特殊函数和this指针(笔记)
    C++学习 之 类的声明及成员的访问(笔记)
    C++学习 之 指针及动态内存分配(笔记)
    C++学习 之 函数的重载及内联(笔记)
    C++学习 之 控制程序流程 (笔记)
    pkg-config too old的解决方法
    编译中出现的undefined reference to XXX
    sourceInsight下标题栏显示文件完整路径
    linux下 sleep() 与 usleep()
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/10605407.html
Copyright © 2020-2023  润新知