Qt动态库

news2024/11/18 11:41:54

QT带界面的动态库

创建动态库

一、新建一个C++的动态库的项目

在这里插入图片描述

选择C++的动态库的项目,进行下一步

在这里插入图片描述

修改项目的名字和项目的保存的路径。

在这里插入图片描述

选着编译的方式,不需要改,进行下一步。

在这里插入图片描述

选着动态库,编译成动态库,进行下一步。

在这里插入图片描述

项目中会自动的生成这些文件,点击完成。

看一下自动生成的文件

  • .pro

    QT -= gui						#增加的模块
    
    TEMPLATE = lib					#编译成库文件
    DEFINES += LOGIN_LIBRARY		#库文件的名字
    
    CONFIG += c++11
    DEFINES += QT_DEPRECATED_WARNINGS
    SOURCES += \
        login.cpp
    
    HEADERS += \
        LogIn_global.h \
        login.h
    
    # Default rules for deployment.
    unix {
        target.path = /usr/lib
    }
    !isEmpty(target.path): INSTALLS += target
    
    
  • _global.h

    #ifndef LOGIN_GLOBAL_H
    #define LOGIN_GLOBAL_H
    
    #include <QtCore/qglobal.h>
    
    #if defined(LOGIN_LIBRARY)
    #  define LOGIN_EXPORT Q_DECL_EXPORT
    #else
    #  define LOGIN_EXPORT Q_DECL_IMPORT
    #endif
    
    #endif // LOGIN_GLOBAL_H
    
    

    这里定义了符号DLL_EXPORT用于替代Qt的宏Q_DECL_EXPORT或Q_DECL_IMPORT。

    可以到符号DLL_EXPORT,就是我们开始给起的项目的名字,我们需要在我们需要输出的地方使用这个宏来输出可以使用的对象。比如一个类,一个函数等。

    注意:有时候我们看到文件输出了.dll,但是没有文件.lib,就是没有使用这个宏去输出我们的文件。

    一个共享库导出给用户使用的类、符号、函数等都需要用宏Q_DECL_EXPORT来定义导出,一个使用共享库的应用程序需要通过Q_DECL_IMPORT导入共享库里的可用对象。

注意:在需要导出的类,导出函数的地方需要增加*_EXPORT的这个宏,不然在动太库的导出中就会缺失*.lib文件。

  • .h

    #ifndef LOGIN_H
    #define LOGIN_H
    
    #include "LogIn_global.h"
    
    class LOGIN_EXPORT LogIn
    {
    public:
        LogIn();
    };
    
    #endif // LOGIN_H
    

    增加了一行#include “*_global.h”。

二、编写代码

根据自己的需求,编写自己的的动态库的函数和类,在需要导出的地方需要增加导出的宏。才能导出到*.lib文件中,可以根据自己的需要导出,就可以避免了访问。

三、构建动态库项目

生成动态库的项目事不需要进行执行的,只要能够构建成功就可以了。

注意:如果自己动态库中包含了资源文件,那么动态库就可以直接访问了,不管是动态库还是静态库,后面都不需要原始的资源文件了。

在这里插入图片描述

自己使用动态库的版本的信息一定要跟构建时候的信息一致,不然会出现无法打开.lib文件等错误。

构建完成之后,可以在自己的构建的目录中查看生成的动态库的文件。

生成了.dll文件和.lib文件。

四、使用动态库

动态库的隐式调用

隐式链接调用主要用于同一种编程软件(如Qt)生成的代码的共享。

需要的文件:.h文件 _global.h文件 .lib文件,放到项目的include目录下,.dll动态库放到可执行的文件目录下。

在.pro文件中增加进去动态库的链接:一、可以通过界面上的操作进行库的增加。二、直接在.pro中,自己手动的增加和指定库的的路径。如LIBS += -L$$PWD/./ -l(库的名字)

动态库的显示调用

需要的文件: .dll文件

显式链接调用是只有DLL文件,知道DLL里的函数原型,使用QLibrary类对象在应用程序里动态加载DLL文件,声明函数原型,并使用DLL里的函数。这种方式需要在应用程序里声明函数原型,并解析DLL里的函数。

void MainWindow::on_pushButton_clicked()
{
   QLibrary myLib("DelphiDLL");		//加载动态库文件
   if (myLib.isLoaded())			//判断动态库是否已经加载了
     QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第1处");
   typedef int (*FunDef)(int); 		//声明函数的原型
   FunDef myTriple = (FunDef) myLib.resolve("triple"); //解析DLL中的函数 查找函数”triple“
   int V=myTriple(ui->spinInput->value()); //调用函数
   ui->spinOutput->setValue(V);
   if (myLib.isLoaded())
     QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第2处");
}

通过动态库,就可以把自己自定义的控件进行了打包。

创建静态库

有了之前的动态库,如果我们需要生成一个静态库。我们只需要在.pro文件中增加CONFIG+= staticlib

其他的步骤跟动态库的生成是一样的,没有什么的差别。

在构建的目录中会生成一个比较一点的.lib文件

把头文件和.lib的静态库文件增加到使用的项目当中就可以使用了,编译好新的项目的文件是不依赖库文件的,在编译的时候已经加载了静态库,这个就是动态库和静态库的区别。

.pro文件中增加CONFIG+= staticlib

其他的步骤跟动态库的生成是一样的,没有什么的差别。

在构建的目录中会生成一个比较一点的.lib文件

把头文件和.lib的静态库文件增加到使用的项目当中就可以使用了,编译好新的项目的文件是不依赖库文件的,在编译的时候已经加载了静态库,这个就是动态库和静态库的区别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]JAVA毕业设计社区生活超市管理系统(系统+LW)

[附源码]JAVA毕业设计社区生活超市管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

[附源码]Python计算机毕业设计SSM计算机学院课程设计管理系统(程序+LW)

[附源码]Python计算机毕业设计SSM计算机学院课程设计管理系统&#xff08;程序LW) 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

基于安卓的课程管理系统app设计

目 录 第1章 绪论 1 1.1 什么是电子课程管理 1 1.2 系统开发的背景 1 1.3 本文主要工作 1 1.4 系统设计目标分析 2 第2章 基本技术方案 3 2.1 Android概述 3 2.2 Android系统的四大组件 3 2.3 Android中的相关技术介绍及分析 5 2.3.1 Android系统架构研究 5 2.3.2 Android架构分…

LeetCode 167. 两数之和 II - 输入有序数组

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 167. 两数之和 II - 输入有序数组&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称…

2.zookeeper

1.工作机制 从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的状态发生变化&#xff0c;Zookeeper就将负责通知已经在Zookeeper上注册…

p2.第一章 基础入门 -- 冯诺依曼体系和计算机基础 (二)

1.2 核心基础 1.2.1 计算机基础知识 艾伦麦席森图灵&#xff08;Alan Mathison Turing&#xff0c;1912年6月23日&#xff0d;1954年6月7日&#xff09;&#xff0c;英国数学家、逻辑学家&#xff0c;被称为计算机科学之父&#xff0c;人工智能之父。 图灵提出的著名的图灵机模…

铺瓷砖问题

1、题目 用 121 \times 212 的瓷砖&#xff0c;把 N2N \times 2N2 的区域填满&#xff0c;返回铺瓷砖的方法数。 2、思路 记录 F(n) 表示空的 n∗2n * 2n∗2 区域的铺瓷砖方法数。 如果第一块瓷砖 A 竖着放&#xff0c;则问题就变成了 F(n−1)F(n-1)F(n−1) 即空的 (n−1)∗…

C++习题3

求余运算符% 位运算&#xff08;<< >> & | ! ^ 左右移位&#xff0c;与&#xff0c;或&#xff0c;非 &#xff0c;异或&#xff09; 这些符号的运算对象都是整型 unsigned short x0xffff cout<<x; cout输出的是整数&#xff0c;所以要将16进制…

基于jsp+ssm的员工人事工资管理系统-计算机毕业设计

项目介绍 本系统是基于JSP的人事管理系统&#xff0c;使用java来实现动态管理以及数据库管理系统采用mysql等共同来完成。管理员可以通过人事管理系统进行工资管理、用户管理、员工考勤管理、部门管理、权限管理等。经理用户则可通过人事管理系统对进行工资管理、考勤管理、部…

快速排序(看完就会)

目录 什么是快速排序 快速排序的步骤&#xff1a; 以上&#xff1a; 图片步骤简绘&#xff1a; 代码实现&#xff1a; 什么是快速排序 快速排序是由C.A.R.Hoare在1960年提出。它的基本思想是&#xff1a;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部…

easypoi导出excel,列要求是数字导出是文本的问题~并分析源码

&#x1f4c3;目录跳转&#x1f4da;简介&#xff1a;实体类分析源码效果&#x1f4da;简介&#xff1a; 由于使用了easypoi导出的excel列需要是数字的但是导出的默认是文本类型&#xff0c;这样选择列就无法进行统计求和&#xff0c;由于没有认真看注解导致我跑去分析源码。所…

ssm校园兼职系统|求职招聘系统计算机专业毕业论文java毕业设计开题报告

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《ssm校园兼职系统》该项目采用技术&#xff1a;jsp springmvcspringmybatis cssjs等相关技术&#xff0c;项目含有源码、文档、配套开发软件、软…

《歌在飞》后蒙古包美女又一力作,《一路欢歌到北京》超然来袭

纵观中国华语乐坛&#xff0c;内蒙古音乐独树一帜&#xff0c;而要说到内蒙古的音乐人&#xff0c;就不得不提及苏勒亚其其格。说起著名音乐人苏勒亚其其格&#xff0c;她是一个地道的蒙古族人&#xff0c;如今是内蒙古乌兰牧骑独唱演员。 苏勒亚其其格是草原飞出的金凤凰&…

c++状态机的使用

什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型。英文名字叫State Machine &#xff0c;不是指一台实际机器&#xff0c;一般就是指一张状态转换图。全称是有限状态自动机&#xff0c;自动两个字包含重要含义。给定一个状态…

Pandas中使用Merge、Join 、Concat合并数据效率对比

在 Pandas 中有很多种方法可以进行dataframe(数据框)的合并。 本文将研究这些不同的方法&#xff0c;以及如何将它们执行速度的对比。 合并DF Pandas 使用 .merge() 方法来执行合并。 import pandas as pd # a dictionary to convert to a dataframe data1 {identificati…

配件厂商Hyper推出支持苹果Find My背包,背包防丢越来越智能

配件厂商 Hyper 今天推出了一款支持 Find My 的双肩包 HyperPack Pro&#xff0c;这样发生遗失或者失窃事件之后能够通过苹果的这项追踪技术快速锁定背包的位置&#xff0c;帮你快速找回。 背包有一个太阳镜口袋和易于拿取的前袋&#xff0c;此外背包上还有一个隐藏式口袋&am…

Github Student Developer Pack申请流程【不在学校的认证方法】

一、GitHub Student Developer Pack申请流程 首先你需要注册一个Github账号 进入GitHub Student Developer Pack申请页面&#xff0c;点击sign up for student developer pack 接着会出现如下图所示的界面&#xff0c;因为是学生&#xff0c;所以点击左下角的Get student ben…

Python打包神器,打包速度快生成文件小防反编译

分享一款打包速度快、生成文件小、更加安全的Python打包神器&#xff0c;本内容来源于网络。 一. pyinstaller和Nuitka使用感受 1.1 使用需求 这次也是由于项目需要&#xff0c;要将python的代码转成exe的程序&#xff0c;在找了许久后&#xff0c;发现了2个都能对python项目…

软件测试之系统测试总结报告

引言 编写目的 编写该测试总结报告主要有以下几个目的 通过对测试结果的分析&#xff0c;得到对软件质量的评价分析测试的过程&#xff0c;产品&#xff0c;资源&#xff0c;信息&#xff0c;为以后制定测试计划提供参考评估测试测试执行和测试计划是否符合分析系统存在的缺陷…

(附源码)Springboot中北创新创业官网 毕业设计 271443

Springboot中北创新创业官网 摘 要 进入21世纪以来&#xff0c;计算机有了迅速的发展。计算机应用、信息技术全面渗透到了人类社会的各个方面&#xff0c;信息化已成为世界经济和社会发展的大趋势。本文主要通过对中北创新创业官网的功能性需求分析&#xff0c;对系统的安全性和…