以SEAL库的编译为例 ,使用cmake能够成功编译SEAL库的可执行文件的前提下,将使用SEAL库的函数编译成可执行的so文件。
以里边的1_bfv_basics.cpp为例,里边有个函数void example_bfv_basics(),如果你直接用它的话还得带着#include “examples.h”,这个examples.h里边又带着seal的一大串函数很麻烦。可以把这个函数编译成so文件。
g++ 1_bfv_basics.cpp -std=c++17 -fPIC -shared -lm -ldl -o libexamples.so `pkg-config --cflags --libs seal`
注意这里的so文件必须是以lib为开头的,而且不能只有lib,-std=c++17是因为SEAL库需要c++17的支持。
然后就可以得到一个文件libexamples.so,把这个文件拷贝到/usr/lib下。
# vim /etc/ld.so.conf //在新的一行中加入库文件所在目录
/usr/lib
# ldconfig //更新/etc/ld.so.cache文件
找一个地方调用这个so文件。
ex.h
void example_bfv_basics();
ex.cpp
#include <cstdio>
#include <iostream>
#include "ex.h"
using namespace std;
int main(){
example_bfv_basics();
}
对这个ex.cpp进行编译
g++ ex.cpp -L./ -lexamples -o ex -lpthread
注意这里so文件只有lib后边那部分名称,也没有后缀名。-lpthread是和多线程相关,去掉会出错。
./ex
这样就能出来了。如果是自己写的函数的话也可以用这个调用方式。
上面的主要是c++调用c++编译的so文件,java的话这个编译出来的so文件中的函数也是能调用的,以为是个void函数,java语言中也有这个类型,我就不做演示了(因为Linux下我java真不行)。如果c++使用的是java没有的函数类型会比较麻烦一些,可以看看网上其他教程,但是编译执行可以还用这一条。