英格兰世界杯预选赛_世界杯卡塔尔 - sctzjx.com

Qt调用动态库的三种方式(linux)

  • Home
  • 女篮世界杯时间
  • Qt调用动态库的三种方式(linux)
  • 2025-12-21 10:28:43
  • admin

本文章主要记录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

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

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

Previus Post
移动卡不换号改大流量套餐怎么改?移动有29元大流量卡吗?

Copyright © 2088 英格兰世界杯预选赛_世界杯卡塔尔 - sctzjx.com All Rights Reserved.
友情链接