当前位置: 首页 > 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…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

OpenHarmony标准系统-HDF框架之I2C驱动开发

文章目录 引言I2C基础知识概念和特性协议&#xff0c;四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线&#xff0c;由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...

Spring Boot 与 Kafka 的深度集成实践(二)

3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中&#xff0c;配置 Kafka 生产者主要是配置生产者工厂&#xff08;ProducerFactory&#xff09;和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例&#xff0c;而 KafkaTemplate 则是用于发送消息的核心组件&#x…...