qt调用so共享库

本文详细介绍了在Linux环境下如何通过QLibrary加载SO共享库,并提供了加载失败后的错误处理策略。

今天测试完成在linux下调用so共享库,和在Windows下调用dll一样。 QLibrary mylib("/home/mylinux/wjp/testso/libposapi.so");用了全路径,当前路径不行,还需要试验。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QLibrary>

typedef  unsigned long (*fun)( unsigned short	InputSize, char	*InputXMLString,  unsigned short	OutputSize,   char	*OutputXMLString);

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QLibrary mylib("/home/mylinux/wjp/testso/libposapi.so");
    ui->label->setText("myLib load?????");

        if (mylib.load())
        {

            ui->label->setText("myLib load");
             fun open1=(fun)mylib.resolve("PosTaxControlService");
             if (!open1)
             {
                 ui->label->setText("myLib load but err");
                 return;
             }
             else
             {
                  ui->label->setText("myLib load ok");
             }

......
               int li_ret(0);
               li_ret=open1(ilen, ls_strin, outlen, ls_strout);
......
               mylib.unload();

}
        else
        {
             ui->label->setText("myLib not load");
        }



}

MainWindow::~MainWindow()
{
    delete ui;
}


### 麒麟操作系统中通过 QT 调用 `.so` 动态链接的方法 在麒麟操作系统中,使用 Qt 调用 `.so` 动态链接是一种常见的开发需求。以下是实现这一功能的具体方法和注意事项。 #### 1. 加载动态链接 Qt 提供了 `QLibrary` 类来加载动态链接(`.so` 文件)。可以通过该类完成函数指针的解析以及调用。 ```cpp #include <QLibrary> #include <QDebug> int main() { QLibrary lib("./example.so"); // 替换为实际路径 if (!lib.load()) { // 尝试加载文件 qDebug() << "Failed to load library:" << lib.errorString(); return -1; } typedef void (*FunctionType)(); FunctionType myFunction = (FunctionType)lib.resolve("myFunctionName"); if (!myFunction) { // 解析指定符号 qDebug() << "Symbol not found!"; return -1; } myFunction(); // 调用目标函数 lib.unload(); // 卸载文件 } ``` 上述代码片段展示了如何利用 `QLibrary` 来加载 `.so` 调用其中定义的函数[^1]。 #### 2. 设置环境变量 为了确保程序能够找到所需的 `.so` 文件,在运行前可能需要配置环境变量 `LD_LIBRARY_PATH`: ```bash export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH ``` 此命令会将 `/path/to/your/library` 添加至共享库查找路径中,从而允许应用程序定位到对应的 `.so` 文件[^3]。 #### 3. 使用 CMake 或 qmake 构建项目 当构建涉及多个依赖项时,可以借助工具简化流程管理。对于基于 Qt 的项目来说,通常会选择 CMake 或者 qmake 进行构建脚本编写。 ##### (a)qmake 方式 编辑 `.pro` 文件加入如下内容即可引入外部: ```plaintext LIBS += -L/path/to/libraries -lexample INCLUDEPATH += /path/to/include/files DEPENDPATH += /path/to/source/files ``` ##### (b)CMake 方式 如果采用的是 CMake,则可以在 `CMakeLists.txt` 中这样描述: ```cmake find_library(EXAMPLE_LIB example HINTS "/path/to/libraries") target_link_libraries(your_target_name PRIVATE ${EXAMPLE_LIB}) include_directories("/path/to/include/files") ``` 以上两种方式均能有效解决静态编译期间对头文件及对象模块的需求问题[^2]。 #### 注意事项 - 确认所使用的 `.so` 文件版本与当前系统架构相匹配。 - 对于某些特定场景下的移植工作,比如从 X86 平台迁移到 LoongArch 架构下运行的应用软件,往往还需要重新编译整个工程及其所有的第三方组件以适应新的硬件平台特性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值