Qt调用动态库的三种方式(linux)
本文章主要记录Qt在linux电脑上调用so库的三种调用方式
方式一:静态加载so库
方式二:动态加载so库(QLibrary)
方式三:动态加载so库(dlopen)
其他:
封装的so库叫做:libsoowCapture.so,这个so库又依赖了其他的so库,我是把所有的so库放在lib文件夹里面。库文件+目录结构如下图:
准备工作:
使用qtcreate,先创建一个基本项目,一个dialog窗口,窗口中有一个QPushButton按钮,点击按钮,调用库接口,弹窗显示结果。
方式一:静态加载so库
# pro文件 LIBS += -Llib -lsoowCapture -lhv -lpthread -lImageProc -ljpeg -lcamapi # 项目 添加现有文件,将 libsoowCapture.h 这个头文件加进来 # dialog.cpp void Dialog::test() { char err[100]; soow_InitCameraLib(err); long ret = soow_GetDevCount(err); QMessageBox::information(this, "123", QString::number(ret)); }
方式二:动态加载so库(QLibrary)
# dialog.cpp #include <QLibrary> void Dialog::test() { QLibrary mso("./lib/libsoowCapture.so"); if(mso.load()) { QMessageBox::information(this, "123", "ok"); } else { QMessageBox::information(this, "123", "no"); } typedef long (*func1)(char*); typedef long (*func2)(char*); typedef long (*func3)(long, char*, char*); func1 f1 = (func1)mso.resolve("soow_InitCameraLib"); func2 f2 = (func2)mso.resolve("soow_GetDevCount"); func3 f3 = (func3)mso.resolve("soow_GetDevName"); char err[100]; f1(err); long ret = f2(err); QMessageBox::information(this, "123", QString::number(ret)); char name[100]; char err1[100]; long ret1 = f3(0, name, err1); QMessageBox::information(this, "123", name); }
# 终端,在Qt编译后的文件夹中打开终端 // 1.设置临时环境变量 export LD_LIBRARY_PATH=lib // 2.运行编译出的程序 ./untitled
运行结果可以见 方式三 下面的截图
方式三:动态加载so库(dlopen)
# pro 文件 LIBS += -ldl # dialog.cpp #include <dlfcn.h> void Dialog::test() { void* handle = dlopen("./lib/libsoowCapture.so", RTLD_NOW); if(handle) { QMessageBox::information(this, "123", "ok"); } else { QMessageBox::information(this, "123", "no"); } typedef long (*func1)(char*); typedef long (*func2)(char*); typedef long (*func3)(long, char*, char*); func1 f1 = (func1)dlsym(handle, "soow_InitCameraLib"); func2 f2 = (func2)dlsym(handle, "soow_GetDevCount"); func3 f3 = (func3)dlsym(handle,"soow_GetDevName"); char err[100]; f1(err); long ret = f2(err); QMessageBox::information(this, "123", QString::number(ret)); char name[100]; char err1[100]; long ret1 = f3(0, name, err1); QMessageBox::information(this, "123", name); }
# 终端,在Qt编译后的文件夹中打开终端 // 1.设置临时环境变量 export LD_LIBRARY_PATH=lib // 2.运行编译出的程序 ./untitled
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2021-08-01 Qt操作ini文件