QT 调用动态链接库

引入QT提供的动态加载库的类

#include <QLibrary>

定义函数指针类型

typedef void (*GetResFunction)(uint8_t*, uint8_t*, int);

定义函数指针的主要目的是为了解析和调用动态链接库中的函数。如果你不定义函数指针,就无法直接调用动态链接库中的函数

加载动态链接库

QLibrary myLib("Aes8a");
if(!myLib.load()){
    qDebug()<< "不能加载动态链接库";
}

解析函数

GetResFunction getRes = (GetResFunction)myLib.resolve("GetRes");
if (!getRes) {
   qDebug() << "无法解析函数:" << myLib.errorString();
   myLib.unload();
}

QLibrary::resolve() 方法的作用是解析动态链接库(DLL 或 SO 文件)中导出的函数地址。它是使用动态链接库的核心工具之一,允许你在运行时动态获取函数指针并调用动态链接库中的函数。

调用函数

 getRes(参数1, 参数2, 参数3);  // 调用函数

卸载动态链接库

 myLib.unload();
<think>嗯,用户想在Linux环境下使用QT框架调用动态链接库,也就是.so文件。我需要根据之前提供的引用内容来整理一个清晰的步骤。首先,用户可能需要知道如何创建动态库,然后是如何调用,还有可能遇到的常见问题,比如找不到库或者GL库的问题。首先,动态库的创建部分,引用1提到在QT中新建项目,选择C++库,类型选动态库。那应该包括创建项目,编写代码,编译生成.so文件。这部分需要详细说明步骤,比如项目设置和编译后的输出位置。接下来是调用动态库的方法。引用1和引用4提到了两种方式:隐式调用和显式动态加载。隐式调用需要.pro文件里添加LIBS +=-L路径-l库名,还要包含头文件。而显式调用使用QLibrary类,动态加载符号,这样更灵活,但可能需要处理函数指针。然后要考虑常见问题,比如运行时找不到.so文件。这时候需要设置LD_LIBRARY_PATH,或者把库放到系统目录如/usr/lib。另外,引用3提到的找不到-lGL的问题,用户可能遇到,需要检查OpenGL库的路径,创建软链接或者复制到正确位置。 用户可能还关心代码示例,比如如何在.pro文件里配置,或者QLibrary的使用方法。需要提供具体的代码片段,比如头文件包含、库路径设置,以及加载函数并调用的过程。 还要注意区分调试和发布模式下的路径问题,引用2中的例子显示.so文件在build目录下的特定配置路径,可能需要用户根据实际情况调整路径。 最后,生成相关问题,帮助用户深入理解,比如优化动态库调用、处理不同架构的兼容性,或者如何调试符号未找到的问题。这些可以引导用户进一步探索。</think>### 如何在 Linux QT 中加载和调用动态链接库 .so 文件 #### 一、动态链接库的创建 1. **创建动态库项目** 在 QT Creator 中选择 `文件-新建项目` → `Library` → `C++ 库` → **类型选择“动态库”**。编写接口函数后编译生成 `.so` 文件(如 `libmylib.so`),默认生成路径为项目构建目录的 `Release` 或 `Debug` 子目录[^1][^4]。 2. **关键文件准备** - **头文件**(`.h`):声明对外暴露的函数(需用 `extern "C"` 修饰避免 C++ 名称修饰问题) - **动态库文件**(`.so`):编译后生成的核心二进制文件 #### 二、动态库调用方法 ##### 方法1:隐式链接(常用) 1. **配置 `.pro` 文件** 在调用方的 `.pro` 文件中添加以下内容: ```makefile LIBS += -L$$PWD/../mylib/build/ -lmylib # -L 指定库路径,-l 指定库名(去除前缀 lib 和后缀 .so) INCLUDEPATH += $$PWD/../mylib/include # 头文件目录 ``` 2. **代码调用** ```cpp #include "mylib.h" // 包含头文件 int main() { myFunction(); // 直接调用动态库函数 return 0; } ``` ##### 方法2:显式动态加载(运行时加载) 使用 `QLibrary` 类动态加载符号: ```cpp #include <QLibrary> typedef int (*MyFuncType)(int); // 定义函数指针类型 void loadLib() { QLibrary lib("libmylib.so"); if (lib.load()) { MyFuncType myFunc = (MyFuncType)lib.resolve("myFunction"); if (myFunc) { int result = myFunc(42); // 调用函数 } } } ``` #### 三、常见问题解决 1. **运行时找不到 `.so` 文件** - **临时方案**:终端执行 `export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH` - **永久方案**:将 `.so` 文件复制到系统库目录(如 `/usr/lib`)或创建符号链接[^1][^3] 2. **报错 `cannot find -lGL`** OpenGL 库路径问题,需创建软链接(以 Ubuntu 为例): ```bash sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/libGL.so ``` #### 四、完整调用流程示例 ```cpp // 隐式调用示例 #include "mylib.h" #include <QDebug> int main() { qDebug() << "调用动态库函数结果:" << calculateSquare(5); // calculateSquare 定义于 mylib.h return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里藍天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值