qt camkelist编写实现程序运行时动态加载库并访问其函数

news/2025/1/16 2:54:33/

文章目录

      • **创建库并实现导出函数**
      • **编写CMakeLists.txt**
      • **调用**

在使用C++和Qt进行项目开发时,CMake是一个常用的跨平台构建系统生成工具,它能够管理构建过程,生成Makefile或者项目文件。想要使用CMake来动态链接一个库,并调用其中的函数,可以按照以下步骤进行:

创建库并实现导出函数

  • 需要在动态库中导出你需要的函数

#ifdef __cplusplus
extern "C"{
#endifQ_DECL_EXPORT int exprotFunc(int a,char b ,void* c);#ifdef __cplusplus
}
#endif
  • Q_DECL_EXPORT是导出函数的宏
  • 防止读取不到正确的字符需加上__cplusplus方式

编写CMakeLists.txt

  • 例如

    cmake_minimum_required(VERSION 3.0)
    project(MyQtProject)
    # 设置C++标准
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED True)
    # 寻找Qt库
    find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)
    # 添加你的库路径
    target_link_directories(${CMAKE_SOURCE_DIR}/path/to/your/library)
    # 添加你的库文件
    set(LIBSQt5::GuiQt5::WidgetsQt5::Core)# 添加你的Qt项目add_executable(${PROJECT_NAME} main.cpp)# 链接Qt库和你的库
    target_link_libraries(${PROJECT_NAME}  ${LIBS})
  • path/to/your/library是库文件所在的目录。

调用

  • 需要在源代码中包含库的头文件。例如:

    #include <QApplication>
    #include <QMainWindow>
    #include <QLibrary>
    // 包含你的库的头文件
    #include "yourlibraryheader.h"using Init = decltype(exprotFunc)
    int main(int argc, char *argv[])
    {QApplication app(argc, argv);QMainWindow window;window.show();QLibrary library("./yourlibrary.dll")if(library.load()){// typedef int (*yourType)(int,char,void*)//auto Func =  (Init)(library.resolve("exprotFunc"));auto Func = reinterpret_cast<Init*>(library.resolve("exprotFunc"));if(Func){bool result  = Func(a,b,c); }}library.unload();return app.exec();
    }
    
  • QLibrary library(“./yourlibrary.dll”):创建了一个QLibrary对象,并指定了要加载的DLL的路径。

  • library.resolve(“exprotFunc”):尝试在加载的DLL中解析名为exprotFunc的函数。如果解析成功,返回该函数的函数指针。

  • reinterpret_cast<Init>(…)*:将解析得到的函数指针转换为Init类型。这里Init是通过decltype获取的exprotFunc函数的类型。也可以使用注释的typedef方式

  • Func(a, b, c):如果解析成功,这里调用函数。这里的a, b, c应该是传递给函数的实际参数。

  • library.unload():在调用完函数后,卸载DLL。


http://www.ppmy.cn/news/1429807.html

相关文章

稀碎从零算法笔记Day51-LeetCode:最小路径和

题型&#xff1a;DP、数组、矩阵 链接&#xff1a;64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为…

ELK 日志分析(二)

一、ELK Kibana 部署 1.1 安装Kibana软件包 #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kibana/kibana.yml --2--取消注释&#xff0c;Kiabana 服务的默认监听端口为5601 server.po…

PHPStudy(小皮)切换PHP版本PDO拓展失效的问题

因为要看一个老项目&#xff0c;PHP版本在8.0以上会报错&#xff0c;只能切换到7.2&#xff0c;但又遇到了PDO没开启的问题。 PHPStudy上安装的PHP7.2是需要自己配置一下的&#xff0c;里面php.ini文件是空的&#xff0c;需要将php.ini-development改成php.ini&#xff0c;对于…

vue学习日记21:非父子通信(拓展)-event bus 事件总线

一、概念 是一对多的关系 二、代码 BaseA <template><div class"base-a">我是A组件&#xff08;接受方&#xff09;<p>{{msg}}</p> </div> </template><script> import Bus from ../utils/EventBus export default {cr…

uniApp设置和清除定时器

首先是在data中定义一个变量&#xff0c;用来存放定时器 data() {return {timer: null,} } 在适当的地方创建定时器 this.timer setInterval(() > {console.log(111); }, 10000) 在onHide或者是onUnload中销毁定时器&#xff0c;一般来说tabbar页面的切换会触发onHide&…

解决 vue install 引发的 failed Error: not found: python2 问题

发生 install 异常时&#xff0c;提示信息如下所示&#xff1a; npm ERR! code 1 npm ERR! path U:\cnblogs\fanfengping-dtops\fanfengping-dtops-front\node_modules\node-sass npm ERR! command failed npm ERR! command U:\Windows\system32\cmd.exe /d /s /c node scripts…

学习springcloud中Nacos笔记

一、springcloud版本对应 版本信息可以参考&#xff1a;版本说明 alibaba/spring-cloud-alibaba Wiki GitHub 这里说2022.x 分支对应springboot的版本信息&#xff1a; Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version 2022.0.0.0* Spring Cloud 202…

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件&#xff0c;可自动抓取小红书评论数据&#xff0c;并且含二级评论。 小红书的评论接口URL是&#xff1a; https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程&#xff1a; 进而封装成GUI界面软件&#xff0c;如下&…