一、环境配置
虚拟机: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