在linux上使用C++调用动态链接库.so文件(输入两个参数)

在新服务器上已经实现了用Python调用.so文件,现在尝试C++接口,

  1. 使用c++编写和使用.so动态链接库_51CTO博客_c++动态链接库
  2. 参考这个人的调用函数Linux C++简单生成与调用so库_秦小乙的工作台的博客-CSDN博客
  3. 记录在C++里面调用linux的地址直接写绝对路径就可以,不用双斜杠:string strPath = "/home/ljx/vis_process/vis/20220528024000_11.jpg";
  4. 字符串传递参考:C++字符串作为参数的传递 - 玩转机器学习 - 博客园 (cnblogs.com)

直接上代码:

#include<iostream>
#include<dlfcn.h>
using namespace std;
extern "C" 
int main(){
	void *handle = dlopen("./lib4cloudreg.so",RTLD_LAZY);
	double (*ans) (char *,double);
	char *error;
	ans = (double(*)(char * ,double))dlsym(handle,"convert_array");
	//ans = (double(*)(double))dlsym(handle,"_Z3dddd");
	 char strPath[]  = "/home/ljx/vis_process/vis/20220528024000_11.jpg";
	double ret = (*ans)(strPath ,0.1);
    std::cout<<ret<<std::endl;
	dlclose(handle);
	return 0;
}

解释一下,我的.so文件叫lib4cloudreg.so,函数原型是:double convert_array(const char* str,double eps),所以传递了两个参数,第一个是图片在linux上面的地址,另外一个是eps的值,并接收一个返回值。

下面是操作步骤:

成功调用的步骤:

g++ mydll.cpp -fpic -shared -o lib4cloudreg.so  -I /usr/local/include/opencv4 -L /usr/local/lib64 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_calib3d -lopencv_features2d -lopencv_videoio -std=gnu++11
  1. 首先编译cpp生成so文件:g++ mydll.cpp -fpic -shared -o lib4cloudreg.so  -I /usr/local/include/opencv4 -L /usr/local/lib64 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_calib3d -lopencv_features2d -lopencv_videoio -std=gnu++11

  1. 接着编译调用函数的cpp,生成a.out可执行文件:

  1. 最后执行./a.out即可:

猜你喜欢

转载自blog.csdn.net/qq_37248679/article/details/127949284