首页 > 编程语言 >将学习型索引ALEX的cmake项目在虚拟机上用java运行

将学习型索引ALEX的cmake项目在虚拟机上用java运行

时间:2024-11-11 14:45:43浏览次数:3  
标签:cmake -- 虚拟机 yum build java example

一、环境配置

虚拟机:Centos7

gcc -v:11.2.1

java -version:1.8.0

 二、ALEX实现步骤    

1、安装c++

输入命令

sudo apt-get install g++

出错

sudo: apt-get:找不到命令

原因:Centos7中用yum命令下载

再次输入命令

sudo yum install g++

再次报错

已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
没有可用软件包 g++。
错误:无须任何处理

尝试修改yum镜像路径文件/etc/yum.repos.d/CentOS-Base.repo,出现了新的错误

问题:CentOS 7 在2024年6月30号以后,官方就不再维护了。

解决方法:换阿里源,输入代码

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
--2024-11-07 20:24:11--  https://mirrors.aliyun.com/repo/Centos-7.repo

然后刷新一下

yum makecache

安装epel-release

yum install epel-release

再次安装g++报错

问题:软件包名错误,正确包为gcc-c++

sudo yum install gcc-c++

安装成功

2、安装cmake

通过wget下载需要升级的cmake版本3.12

wget https://cmake.org/files/v3.12/cmake-3.12.0.tar.gz

3、解压后进入cmake-3.12.0查看README.rst

按照提示执行

./bootstrap && make && sudo make install

等待安装完成。执行cmake --version

安装成功

4、从github中下载并运行alex索引项目

项目地址:https://github.com/microsoft/ALEX

在alex目录下输入

mkdir build
cd build
cmake ..

运行后报错

这里直接科学上网就可以解决,不过我选择先将其中文件下载复制到doctest文件中,同时修改CmakeList文件,再次运行之前的命令就完成了

5、建立项目

在alex主目录下执行build.sh,出现大量报错

猜测是gcc版本问题,于是更新gcc版本,参考以下连接【Linux】CentOS7.6 升级 gcc/g++_centos7.6升级gcc-CSDN博客

更新完成后,删除原build文件夹,重新cmake项目,再运行build.sh脚步文件

虽然有warning但是成功完成了

6、c++执行example

./build/example
./build/test_alex
./build/benchmark \
> --keys_file=resources/sample_keys.bin \
> --keys_file_type=binary \
> --init_num_keys=500 \
> --total_num_keys=1000 \
> --batch_size=1000 \
> --insert_frac=0.5

成功运行,唯一没出错的一步

三、通过java调用

1、编写java类文件并编译

-定义类和调用函数

public class learnedindexJNI {
    static {
        System.loadLibrary("myCppLibrary");
    }
    public native int example();
}

 其中类名是learnedindexJNI,要读入的动态库命名为myCppLibrary,其中的方法名是example

-编译成cpp头文件

javah -jni learnedindexJNI

2、修改原项目代码

以原example代码为例,对代码进行修改。原代码中main函数不用了,将其修改为我们需要的example函数,记得其中函数命名的部分要和头文件中的对应

#include "learnedindexJNI.h"

extern "C"  
JNIEXPORT jint JNICALL Java_learnedindexJNI_example  (JNIEnv *, jobject){
//原代码内容
}

3、编译生产动态库

g++ -shared -fPIC -o alexlearnedindex.so /opt/ALEX-master/src/benchmark/main.cpp -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux

在使用CPU指令集优化代码的时候,编译出错

问题:未添加编译选项,函数在Intel指令集官网查找:https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html

添加编译指令-mxxx,如图加入-mbmi1

最终编译代码

g++ -shared -fPIC -o alexlearnedindex.so /opt/ALEX-master/src/benchmark/main.cpp -mpopcnt -mlzcnt -mbmi

问题:找不到jni_md.h文件

解决方法:jni_md.h 位于include / linux文件夹中,但是include中没有指向这两个文件的符号链接。于是自己建立软连接

sudo ln -s /opt/jdk/jdk1.8.0_171/include/linux/jni_md.h /opt/jdk/jdk1.8.0_171/include/jni_md.h

再次运行即可编译成功

4、执行调用动态库中的C++接口

public class Main {
    public static void main(String[] args) {
        //System.out.println(System.getProperty("java.library.path"));

        learnedindexJNI jni = new learnedindexJNI();
        jni.example();
    }
}

运行后出错:no myCppLibrary in java.library.path

解决方法:编译生产的so文件应该命名为libmyCppLibrary,同时要放在java.library.path中

四、总结

记录了将一个cpp项目用java运行的全部步骤,这只是一个alex学习型索引的简单实现,更加全面的学习型索引功能还有待开发。

标签:cmake,--,虚拟机,yum,build,java,example
From: https://blog.csdn.net/xuanyuxy/article/details/143607166

相关文章

  • Java 日期 API
    JDK8之前日期与时间戳之间的转换publicclassTest{publicstaticvoidmain(String[]args){Datedate=newDate();System.out.println("date="+date);//date=SunSep2614:48:52CST2021Datedate1=newDate(1632638970000L......
  • Java爬虫:京东商品SKU信息的“偷心盗贼”
    在这个信息爆炸的时代,数据就像是藏在深山里的宝藏,等待着我们这些“数据探险家”去发掘。今天,我们要化身为一名“偷心盗贼”,用Java这把锋利的“剑”,精准地从京东的海洋中窃取商品的SKU信息。别担心,我们这是合法的“盗窃”,因为我们只是在学习如何用代码与网页对话。环境准备:装......
  • Java爬虫精准获得JD商品SKU信息
    在数字化时代,数据的价值日益凸显,尤其是在电商领域。通过爬虫技术,我们可以从网站中提取有价值的信息,用于市场分析、价格监控等。Java作为一种成熟且功能强大的编程语言,拥有丰富的库支持,使其成为编写爬虫的理想选择。本文将详细介绍如何使用Java编写爬虫,以精准获取京东(JD)商品的详......
  • 2024年Java后端开发最全面试攻略,不管你工作几年,都得看看
    互联网公司的面试,从形式上说,一般分为2~3轮技术面+1轮HR面,不过某些公司没有HR面试。在技术面试中,面试官一般会就你所应聘的岗位进行相关知识的考察,也叫基础知识和业务逻辑面试,只要回答的不是特别差,面试官通常会继续跟你聊聊项目,这个时候就开始了项目面试。也就是说,技......
  • jsp页面和Java代码
    EL用于在jsp页面获取servlet传的值使用方式1.在头文件里开启不忽略el表达式<!--jsp头文件isELIgnored="false"这里是不忽视el语法--><%@pagecontentType="text/html;charset=UTF-8"language="java"isELIgnored="false"%>2.使用${name}方式来获取传来的值实......
  • java里面使用groovy案例+详解
    场景:最近有一个计算商品运费的,如果商品的数量大于快递公司设置的数量10那么超出部分也需要计算额外运费,那么这些计算过程代码我能不能不在java里面写呢,用一种可配置化的方式来根据不同的传参计算出运费?页面传参[{“key”:“起订量(大单位)”,“isRequired”:true,“is......
  • 20万字208道Java经典面试题总结(附答案)
    1、JDK和JRE有什么区别?JDK(JavaDevelopmentKit),Java开发工具包JRE(JavaRuntime Environment),Java运行环境JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。2、==和 equals 的区别是什么?对于基本类型,==比较的......
  • 2024年最全java面试题(八股文)
    1.Java基础1.1为什么Java代码可以实现一次编写、到处运行?在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class)。在程序运行时,JVM负责将字节码翻译成特定平台下的机器码并运行,也就是说,只要在不同的平台上安装对应的JVM,就可以运行字节码文件。1.2一个Java文件里......
  • Java——接口
    一、接口是什么在Java中,接口(Interface)是一种引用数据类型,类似于类,然而它只能包含常量、方法签名和嵌套类型。接口不能包含实例变量或方法的实现(在Java8及之后的版本,可以在接口中定义默认方法和静态方法)。接口主要用于定义类的外部行为,并允许类实现这些行为。二、接口详细介......
  • JavaScript基础总结
             JavaScript(简称JS)是一个广泛使用的客户端脚本语言,常用于网页开发中。它可以在浏览器中运行,执行交互操作和动态效果。以下是JavaScript基础的所有核心知识点,按主题分类列出。1.基本语法声明变量使用var、let和const来声明变量:varname='Alice';/......