栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531010.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号