当前位置: 首页 > news >正文

Qt生成动态链接库并使用动态链接库

项目结构

整个工程由一个主程序构成和一个模块构成(dll)。整个工程的结构目录如下

   Define.priMyProject.proMyProject.pro.user
+---bin
+---MainProgrammain.cppMainProgram.proMainProgram.pro.userwidget.cppwidget.hwidget.ui
+---MathDllMathDll.proMathDll.pro.userMyMath.cppMyMath.h

qmake文件介绍

1 MyProject.pro

TEMPLATE = subdirs #多工程项目
CONFIG += ordered #指定编译顺序
SUBDIRS = MathDll \ #模块(dll)MainProgram #主工程

2 Define.pri

win32 {CONFIG(release, debug|release){contains(QT_ARCH, i386) {BIN_PATH=release_x86_} else {BIN_PATH=release_x64_}} else {contains(QT_ARCH, i386) {BIN_PATH=debug_x86_} else {BIN_PATH=debug_x64_}}
}DESTDIR = $$PWD/bin/$$BIN_PATH #生成的二进制文件(可执行文件或者库)的目标位置,放在pri文件中,在有pro文件包含这样就不用重复写

3 MathDll.pro

QT -= guiTEMPLATE = libCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
DEFINES += MATHDLL_LIBRARY #使用预定义来控制是导出函数符号到dll还是导出dll中的函数符号# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0include($$PWD/../Define.pri) #引入pri文件SOURCES += \MyMath.cpp \MyMath.h
#拷贝头文件到指定目录,以便其它程序能够使用该dll
QMAKE_POST_LINK += xcopy /y/F \"$$PWD/MyMath.h\" \"$$PWD/../bin/includePath\\\" $$escape_expand(\\n\\t)# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

4 MainProgram.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-12-09T17:29:33
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = MainProgram
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0include($$PWD/../Define.pri) #引入pri文件
LIBS += -L$$PWD/../bin/$$BIN_PATH #设置搜索链接动态库的目录CONFIG += c++11INCLUDEPATH += $$PWD/../bin/includePath #设置搜索头文件目录
LIBS += -lMathDll #链接库文件SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

注意 :

LIBS += -L$$PWD/../bin/$$BIN_PATH

这句话是很重要的,在程序编译链接时会使用到动态库的 lib 文件,用于生成程序。而默认链接的位置是 MainProgram 目录下,如果没有该语句就会提示找不到 MathDll.lib 文件,可执行程序生成失败。
在这里插入图片描述

源文件分析

1 MyMath.h

#ifndef MYMATH_H_
#define MYMATH_H_
//包含QObject才能识别 Q_DECL_EXPORT Q_DECL_IMPORT
#include <QObject>
//预定义来控制导入导出符号
#if defined (MATHDLL_LIBRARY)
#define MATHDLL_LIBRRY_EXPORT Q_DECL_EXPORT
#else
#define MATHDLL_LIBRRY_EXPORT Q_DECL_IMPORT
#endifclass MATHDLL_LIBRRY_EXPORT MyMath{
public:MyMath();~MyMath();int add(int a, int b);
};#endif

2 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "MyMath.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{int a = ui->lineEdit->text().toInt();int b = ui->lineEdit_2->text().toInt();MyMath myMath;int sum = myMath.add(a, b); //使用动态链接库中的函数ui->label->setText(ui->label->text() + QString::number(sum));
}

效果

在这里插入图片描述

码云地址

https://gitee.com/wenbai123/my-project

相关文章:

Qt生成动态链接库并使用动态链接库

项目结构 整个工程由一个主程序构成和一个模块构成(dll)。整个工程的结构目录如下 Define.priMyProject.proMyProject.pro.user ---bin ---MainProgrammain.cppMainProgram.proMainProgram.pro.userwidget.cppwidget.hwidget.ui ---MathDllMathDll.proMathDll.pro.userMyMath.…...

E4990A 阻抗分析仪,20 Hz 至 10/20/30/50/120 MHz

01 E4990A 阻抗分析仪 20 Hz 至 10/20/30/50/120 MHz 产品综述&#xff1a; E4990A 阻抗分析仪具有 20 Hz 至 120 MHz 的频率范围&#xff0c;可在宽阻抗范围内提供出色的 0.045%&#xff08;典型值&#xff09;基本准确度&#xff0c;并内置 40 V 直流偏置源&#xff0c;适…...

k8s volumes and data

Overview 传统上&#xff0c;容器引擎(Container Engine)不提供比容器寿命更长的存储。由于容器被认为是瞬态(transient)的&#xff0c;这可能会导致数据丢失或复杂的外部存储选项。Kubernetes卷共享 Pod 生命周期&#xff0c;而不是其中的容器。如果容器终止&#xff0c;数据…...

万宾科技智能水环境综合治理监测系统效果

水环境综合治理是一项旨在全面改善水环境质量的系统工程。它以水体为对象&#xff0c;综合考虑各种因素&#xff0c;通过科学规划和技术手段&#xff0c;解决水环境污染、生态退化等问题&#xff0c;核心理念是“统一规划、分步实施&#xff1b;标本兼治&#xff0c;重在治本&a…...

掌控安全 暖冬杯 CTF Writeup By AheadSec

本来结束时发到了学校AheadSec的群里面了的&#xff0c;觉得这比赛没啥好外发WP的&#xff0c;但是有些师傅来问了&#xff0c;所以还是发一下吧。 文章目录 Web签到&#xff1a;又一个计算题计算器PHP反序列化又一个PHP反序列化 Misc这是邹节伦的桌面背景图什么鬼&#xff1f;…...

jQuery-操作DOM

使用jQuery操作DOM dom : 文档对象模型 就是HTML元素 $() 函数的2个用法: 用法1:放入一个字符串(选择器)表示获取元素 例如 $("p") $("#abc") $(".del") 用法2:放入一个函数&#xff0c;表示文档就绪函数 例如 $(function(){代…...

高级网工在Linux服务器抓包,少不了这几条常用的tcpdump命令。

Linux 的命令太多&#xff0c;tcpdump 是一个非常强大的抓包命令。有时候想看线上发生的一些问题&#xff1a; nginx 有没有客户端连接过来…… 客户端连接过来的时候 Post 上来的数据对不对…… 我的 Redis 实例到底是哪些业务在使用…… tcpdump 作为网络分析神器就派上用场…...

Hough算法数学原理

直线的极坐标方程&#xff1a; x x 0 r cos ⁡ θ x x_0 r\cos \theta xx0​rcosθ y y 0 r sin ⁡ θ y y_0 r\sin \theta yy0​rsinθ x cos ⁡ θ x 0 cos ⁡ θ r cos ⁡ 2 θ x \cos \theta x_0 \cos \theta r \cos^2 \theta xcosθx0​cosθrcos2θ y sin ⁡ θ…...

基于Debain安装 Docker 和 Docker Compose

一、安装Docker # 先升级一下系统 (Ubuntu / Debian 系) sudo apt-get update sudo apt-get upgrade# 如果你是 CentOS、红帽系列则使用&#xff1a; yum update yum upgrade# 安装 Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh二、Dock…...

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效的处理任何大小项目的版本管理。 核心功能&#xff1a; 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外&#xff0c;其他都无脑安装 3、检查一下安装情况 win…...

q2-qt-多线程

是的&#xff0c;Qt框架中提供了专门用于线程池的API。Qt的线程池API位于QtConcurrent命名空间下&#xff0c;以及QThreadPool类中。 QtConcurrent命名空间提供了一些高级的API&#xff0c;可以方便地使用线程池来执行并行任务。其中&#xff0c;QtConcurrent::run()函数可以用…...

指针,函数指针,二级指针,指针传参,回调函数,指针步长

文章目录 指针是什么&#xff1f;指针的定义指针的大小 指针类型指针有哪些类型&#xff1f;指针类型有什么意义&#xff1f;代码演示&#xff1a;(偏移)代码演示(指针解引用时取出的字节数)其他例子 野指针野指针的成因如何避免野指针 指针运算指针整数指针-指针指针的关系运算…...

StringUtils.isEmpty()方法过期的替代方法

1、问题概述&#xff1f; 今天在准备使用StringUtils.isEmpty()工具判断字符串是否为空的时候&#xff0c;突然发现idEmpty上出现了横线&#xff0c;这就表示这个方法可以实现但是已经过期了&#xff0c;官方不推荐使用了。 原因其实是因为有人给官方提交了一个问题&#xff…...

智慧电力运维综合辅助监控系统

智慧电力运维综合辅助监控系统是一种基于现代信息技术的电力运维管理工具&#xff0c;旨在提高电力运行安全&#xff0c;降低运维成本&#xff0c;提高服务质量。依托电易云-智慧电力物联网&#xff0c;该系统通过多种传感器和现场监测装置&#xff0c;远程在线监测、监视电力设…...

v-model和:model的区别

问题 在我们使用Element plus框架时&#xff0c;经常会遇到表单&#xff0c;比如代码块&#xff1a; <el-form ref"ruleFormRef" :model"ruleForm" :rules"rules" label-width"120px" class"demo-ruleForm" :size"…...

网络攻击(二)--情报搜集阶段

4.1. 概述 在情报收集阶段&#xff0c;你需要采用各种可能的方法来收集将要攻击的客户组织的所有信息&#xff0c;包括使用社交网络、Google Hacking技术、目标系统踩点等等。 而作为渗透测试者&#xff0c;你最为重要的一项技能就是对目标系统的探查能力&#xff0c;包括获知…...

oracle异常:ORA-03297:文件包含在请求的 RESIZE 值以外使用的数据

出现这个问题&#xff0c;主要是在对表空间扩容的时候&#xff0c;扩容的大小<实际数据文件大小 1、扩容的语句 alter database datafile D:\APP\ADMINISTRATOR\ORADATA\ORCL\USER.DBF resize 2G; 2、若何确定扩容大小是否比实际文件大 根据路径找到文件&#xff0c;查看…...

Redis 环境搭建

文章目录 第1关&#xff1a;Redis 环境搭建 第1关&#xff1a;Redis 环境搭建 编程要求 根据上述相关知识&#xff0c;在右侧命令行中完成 Redis 集群的部署与安装。 安装完成后&#xff0c;使用 echo “cluster nodes”|redis-cli -p 7001 -c >/root/test.txt 将结果保存。…...

什么是Helpdesk?对工程师有什么帮助?

信息技术时代已然到来&#xff0c;很多IT工程师甚至对Helpdesk都不了解&#xff0c;而Helpdesk已成为许多企业的重要组成部分。那么&#xff0c;什么是Helpdesk呢&#xff1f; Helpdesk&#xff0c;也称为技术支持服务&#xff0c;是一种为用户提供技术帮助和问题解决的服务。它…...

flutter添加全局水印

效果&#xff1a; 可以直接引用&#xff1a;disable_screenshots: ^0.2.0 但是有时候直接引用会报错&#xff0c;可以不引用插件直接把下面的源码工具类放在项目里面 工具类源码&#xff1a; import dart:io; import dart:math;import package:flutter/cupertino.dart; impor…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...