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

server/2024/10/18 0:23:26/

文章目录

      • **创建库并实现导出函数**
      • **编写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/server/7530.html

相关文章

PyTorch小技巧:使用Hook可视化网络层激活(各层输出)

这篇文章将演示如何可视化PyTorch激活层。可视化激活&#xff0c;即模型内各层的输出&#xff0c;对于理解深度神经网络如何处理视觉信息至关重要&#xff0c;这有助于诊断模型行为并激发改进。 我们先安装必要的库: pip install torch torchvision matplotlib加载CIFAR-10数据…

浏览器CSS兼容性问题解决方案整理

1、CSS Hack 使用 hacker 可以把浏览器分为3类&#xff1a;IE6&#xff1b;IE7和遨游&#xff1b;其他&#xff08;IE8 Chrome ff Safari opera等&#xff09; &#xff08;1&#xff09;IE6认识的 hacker 是 下划线 _ 和星号 * &#xff08;2&#xff09;IE7和遨游认识的 hac…

npm常用命令详解

前言 npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理器&#xff0c;它允许开发者安装、分享、更新和管理JavaScript库和工具。以下是一些常用的npm命令及其详细解释&#xff1a; 基础命令 1. 初始化一个新项目 npm init这个命令会引导你创建一个新的pack…

安全狗云眼的主要功能有哪些?

"安全狗云眼"是一款综合性的网络安全产品&#xff0c;主要用于实时监控和保护企业的网络安全。其核心功能包括威胁检测、漏洞扫描、日志管理和合规性检查等。 以下是安全狗云眼的主要功能详细介绍&#xff1a; 1、资产管理 定期获取并记录主机上的Web站点、Web容器、…

vite+vue3+antDesignVue 记录-持续记录

记录学习过程 持续补充 每天的学习点滴 开始时间2024-04-12 1&#xff0c;报错记录 &#xff08;1&#xff09;env.d.ts文件 解决方法&#xff1a; 在env.d.ts文件中添加以下代码&#xff08;可以看一下B站尚硅谷的讲解视频&#xff09; declare module *.vue {import { Defi…

Android startForegroundService与startForeground

启动service service启动有四种形式。 1.显示启动(如直接按service的全路径启动) 2.隐示启动(如通过intent-filter的action标签启动) 3.通过bindservice显示启动。 4.通过bindservice隐示启动。 Demo 创建一个service的子类&#xff0c;如 import android.app.Notifica…

力扣HOT100 - 25. K 个一组翻转链表

解题思路&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dum new ListNode(0, head);ListNode pre dum;ListNode end dum;while (end.next ! null) {for (int i 0; i < k && end ! null; i) {end end.next;}if …

Vue模版语法(初学Vue之v-指令语法)

目录 一、介绍 1.概念 2.常见指令语法及用法 1.v-bind: 2.v-model: 3.v-if / v-else-if / v-else: 4.v-for: 5.v-on: 6.v-show: 7.v-pre: 8.v-cloak: 二、使用 1.Mustache插值语法 2.v-once指令使用 3.v-text指令使用 4.v-html指令使用 5.v-pre指令使用 6.v-…