Linux c++编译so文件 c++ java调用c++的so文件 支持c++17 多线程

以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没有的函数类型会比较麻烦一些,可以看看网上其他教程,但是编译执行可以还用这一条。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值