需求分析

Java应用中需要调用C++的程序,而这个C++的程序中需要引入一个第三方静态库。所以需要将该程序编译成一个动态库文件(.so)供Java调用。

步骤

  • 使用CLion创建一个动态库的项目,会自动生成头文件,源文件和Cmake文件。

  • 头文件在使用so文件的时候也要用到,里面包含源文件中所有函数签名。
  • 源文件有具体的函数,也就是在这里调用第三方库的一些函数封装成一个新的函数。
  • Cmake文件用来编译成so动态库文件,主要有以下几个部分。
cmake_minimum_required(VERSION 3.15)
project(sealNative)
set(CMAKE_CXX_STANDARD 14)
find_package(SEAL 3.4.5 EXACT REQUIRED)
link_libraries(SEAL::seal)
add_library(sealNative SHARED library.cpp library.h)

其中最重要的就是后面三行,简单来说,find_package是找到依赖库,就是这里的第三方静态库libseal.a,然后link_libraries是把这个静态库链接到项目中,如果项目是可执行文件的项目,这里就改成target_link_libraries,最后add_library是指要生成so动态库文件。

  • 在Clion中Build->Build Project即可。
  • 写一个测试的源文件test.cpp
#include <iostream>
//引入动态库对应的头文件
#include <library.h>
using namespace std;
int main(){
//动态库中的方法,其中调用了第三方库
generateKey();
return 0;
}
  • 把生成的.so文件复制到/usr/lib/下,把头文件复制到test.cpp同目录下。
  • g++ -o test test.cpp -L./ -lsealNative && ./test,如果能正确执行方法,说明没问题,其中的-lsealNative需要根据生成的动态库的名称决定,这里的动态库文件全名是libsealNative.so。

github地址

https://github.com/Zeng1998/sealNative

【C++】将调用第三方库的代码封装成动态库供上层调用的更多相关文章

  1. C# 将 WebService 封装成动态库

    C# 将 WebService 封装成动态库 服务与服务之间的远程调用,经常会通过Web Service来实现,Web Service是支持跨语言调用的,可以是java调用c++或c#调用java等, ...

  2. 54.Qt-将界面程序封装成动态库DLL

    1.生成dll 然后选择创建共享库: 创建好后,修改pro文件,改为下面两句(这样就可以创建界面了):  然后修改sharedlib.h: #ifndef SHAREDLIB_H #define SH ...

  3. faster_rcnn c++版本的 caffe 封装,动态库(2)

    摘要: 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ github上的代码链接,求给星星:) https:// ...

  4. Android导入第三方静态库.a编译成动态库.so

    http://ikinglai.blog.51cto.com/6220785/1324985 在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库.如果有源码的话,可以直接跟你自己 ...

  5. 将自己写的HDL代码封装成带AXI总线的IP

    将自己写的HDL代码封装成带AXI总线的IP 1.Tools->create and package IP 2.create AXI4总线的IP 3.新建block design 4.点击右键, ...

  6. python 日志的配置,python对日志封装成类,日志的调用

    # python 日志的配置,python对日志封装成类,日志的调用 import logging # 使用logging模块: class CLog: # --------------------- ...

  7. 表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)

    目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetIn ...

  8. 将pugixml库编译成动态库的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 pugixml库默认是编译成静态库的.要把pugixml库编译成一个动态库,需要对代码做一些修改,具体是将 // If ...

  9. 如何将Js代码封装成Jquery插件

    很多相同的Jquery代码会在很多页面使用,每次都复制粘贴太麻烦了,不如封装成一个Jquery插件就方便了,至于影响网页的速度不,我就没有测试了哈. 代码如下 这是一个自定闪烁打印文字的Jquery特 ...

随机推荐

  1. 解决ArcMap绘图错误

    这几天在用ArcMap对shapefile做矢量化的过程中,遇到一件特别蛋疼的事,ArcMap竟然会出现绘图错误.如下所示: 纠结了许久之后,终于在Esri社区找到了解决办法:帮助文档中说 “检查属性 ...

  2. 15-8 pymysql的使用

    一 安装pymysql模块 1 pycharm安装 file-setting如图:然后点加号,搜索pymsql即可,点击安装 2 pip 安装 pip3 install pymysql 二  连接数据 ...

  3. Libev源码分析06:异步信号同步化--sigwait、sigwaitinfo、sigtimedwait和signalfd

    一:信号简述 信号是典型的异步事件.内核在某个信号出现时有三种处理方式: a:忽略信号,除了SIGKILL和SIGSTOP信号不能忽略外,其他大部分信号都可以被忽略: b:捕捉信号,也就是在信号发生时 ...

  4. 04Top K算法问题

    本章阐述寻找最小的k个数的反面,即寻找最大的k个数,尽管寻找最大的k个树和寻找最小的k个数,本质上是一样的.但这个寻找最大的k个数的问题的实用范围更广,因为它牵扯到了一个Top K算法问题,以及有关搜 ...

  5. OP_REQUIRES failed at conv_ops.cc:386 : Resource exhausted: OOM when allocating tensor with shape..

    tensorflow-gpu验证准确率是报错如上: 解决办法: 1. 加入os.environ['CUDA_VISIBLE_DEVICES']='2' 强制使用CPU验证-----慢 2.'batch ...

  6. supersockets接收过滤器(ReceiveFilter)

    接收过滤器(ReceiveFilter)用于将接收到的二进制数据转化成请求实例(RequestInfo). 实现一个接收过滤器(ReceiveFilter), 你需要实现接口 IReceiveFilt ...

  7. 第三次脱发——Scurm学(ctrl)习(C)心得

    Scrum 学习心得: 首先,敏捷并不是一门具体的技术,而是一种理念或者说是一种思想.它可以指导我们更加高效的开发. 其次,敏捷开发都具有以下共同的特征: 迭代式开发 增量交付 开发团队和用户反馈推动 ...

  8. Python--day62--使用Bootstrap样式的出版社

    没有使用之前: 使用Bootstrap样式之后:

  9. [转载] linux find 命令

    转载自 http://www.jb51.net/os/RedHat/1307.html Linux下find命令在目录结构中搜索文件,并执行指定的操作. Linux下find命令提供了相当多的查找条件 ...

  10. Codeforces Round #181 (Div. 2)

    A. Array 模拟. B. Coach 模拟. C. Beautiful Numbers good number的位和最大不超过\(10^7\),那么只要枚举a或b的个数,然后最多循环7次判断位和 ...