QT 静态库和动态库的使用方法

背景知识:程序在编译成可执行文件时,会有四步过程:
1预处理(头文件和宏定义) g++ -E 1.cpp -o 1.i
2编译 将c代码编译成汇编代码 g++ -S 1.cpp -o 1.s
3汇编 将汇编代码编译成二进制代码 g++ -c 1.cpp -o 1.o
4链接 链接我们用到的函数代码 还有地址(包含静态库而动态库是在运行时链接) gcc 1.c
静态库:在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;
动态库:在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。

一 Qt创建静态库:
1.点击New Project ->Library ->C++库 点击choose

2.在类型选择静态链接库,点击下一步。
3.然后一直点击下一步。

代码如下:
Lib.h
#include “lib.h”

Lib::Lib()
{
}
long Lib::add(int a, int b)
{
return a+b;
}
Lib.cpp
#include “lib.h”

Lib::Lib()
{
}
long Lib::add(int a, int b)
{
return a+b;
}
编译后会生成Lib.o和Lib.a文件。
Lib.o:是我们生成的二进制过程文件。
Lib.a:这就是我们的静态库文件。
二:Qt静态库调用
新建widget工程
pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp
mainwindow.cpp
HEADERS += mainwindow.h
lib.h
FORMS += mainwindow.ui
LIBS += -L$$PWD/./ -lLib
注意:链接的时候不用后缀(.a)。
把Lib.h和Lib.a放到我们的程序目录中。把Lib.h添加到工程。把Lib.a添加到工程中。
三 Qt创建动态库
新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sharedlib)

生成的目录结构如图:

修改 sharedlib.h 中的代码:
// sharedlib.h
#ifndef SHAREDLIB_H
#define SHAREDLIB_H

#include “sharedlib_global.h”

class SHAREDLIBSHARED_EXPORT Sharedlib// 导出类, 客户端可直接加载
{

public:
Sharedlib();
void test();
};

extern “C” Q_DECL_EXPORT int add(int a, int b);//导出函数, 客户端可用 QLibrary 加载

#endif // SHAREDLIB_H
修改 sharedlib.cpp 中的代码:
// sharedlib.cpp
#include “sharedlib.h”

#include

Sharedlib::Sharedlib()
{
}

void Sharedlib::test()
{
QMessageBox::warning(0, “Sharedlib::test”, “Sharedlib::test”);
}

int add(int a, int b)
{
return a+b;
}
四 Qt动态库调用分为两种方式。
第一种方式:需要h、a和dll文件。
h为接口头文件。
a为接口转换文件,把你调用接口转换到dll上。
dll为动态库。
这种方式比较简单直接使用,代码量少(需要把a和dll放在一起)。在pro文件中导入a。
工程文件片段:
HEADERS += mainwindow.h
untitled2.h
share.h
win32: LIBS += -L$$PWD/./ -lShare

INCLUDEPATH += PWD/.DEPENDPATH+=PWD/. DEPENDPATH += PWD/.DEPENDPATH+=PWD/.
第二种方式:只需要h和dll文件。
1.需要在动态库里面写一个C函数,不然没办法获取对象。还要让编译器指定让C编译器编译。注意还必须把成员函数写成虚函数才能调用(我也不知道为什么,谁知道给我留言谢谢)。
如下:
头文件:
class Share
{

public:
Share();
virtual long add(int,int);
virtual void minus();
};
typedef Share* (Obj)();
extern “C”
{
Share * CreatObj();
}
CPP文件:
#include “Share.h”
#include
Untitled2
CreatObj()
{
static Obj = NULL;
if(Obj)
{
return Obj;
}
else
{
return Obj = new Share;
}
}
Share::Share()
{
}
long Share::add(int a,int b)
{
return (long)a+b;
}
void Share::minus()
{
qDebug()<<“minus”;
}
总结:
静态库调用:把Lib.h和Lib.a放到我们的程序目录中。把Lib.h添加到工程。把Lib.a添加到工程中。
动态库调用一:需要h、a和dll文件。
动态库调用二:需要h和dll文件,要在库里面写C接口获取对象(因为C++编译器会把函数的参数名编译进函数,为了支持重载)。

QT 静态库和动态库的使用方法相关推荐

  1. QT添加库(静态库和动态库)

    QT添加库(静态库和动态库) 添加动态库(dll库)的方法:** 就是把所有需要的dll库全部放到exe所在文件夹,和exe处于同一级目录下. 添加静态库(lib库)的方法: 1.右键项目文件,点击添 ...

  2. C++基于QT创建并使用静态库和动态库

    如果这个宇宙里没有你所爱的人,那还算什么宇宙. -- 斯蒂芬 · 威廉 · 霍金 之前写了一篇文章(C++初始动态库和静态库)简单介绍了一下C++静态库和动态库的特点,今天来说一下使用QT这个开发工具 ...

  3. Qt 静态库和动态库

    Qt 静态库和动态库 创建和使用静态库 创建静态库 使用静态库的文件 创建和使用动态库 创建动态库 使用动态库 隐式链接调用共享库 显示调用 创建和使用静态库 创建静态库 1.选择新建文件和项目.=& ...

  4. 包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用

    引言:vs中怎么添加外部头文件? 如过直接在项目头文件处,添加一下,如下图: 否则,依然会报错,如下图: 有两种方法,来解决(你不在vs上的添加它也没事): (1) 直接把外部头文件复制过来,放在此项 ...

  5. [学习备忘录]Linux平台静态库、动态库的一些笔记

    先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...

  6. PHP编译为静态库,makefile生成静态库和动态库

    库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...

  7. 关于Linux静态库和动态库的分析

    From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...

  8. C/C++ 静态库和动态库的区别

    可执行目标文件 可重定位目标文件 共享目标文件 静态库和动态库的区别: 生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中:动态库是在程序运行过程中指定路径或者系统动态库路径下寻找. -l ...

  9. 静态库与动态库详细剖析

    技术交流QQ群:1027579432,欢迎你的加入! 1.库的介绍 库是什么? 二进制文件: 将源代码(.c或.cpp文件)变成二进制格式的源代码: 加密操作(只能使用,无法知道源代码是什么): 库制 ...

最新文章

  1. CentOS 6.2 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
  2. Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化-[Android取经之路]
  3. 反射学习笔记之动态创建对象和调用方法
  4. launch mysql_Mac Pro 开机自启动 PHP-FPM,Nginx,MySql 等软件
  5. JS使用XMLHttpRequest对象POST收发JSON格式数据
  6. 论文笔记之:Deep Attention Recurrent Q-Network
  7. 画布上涂鸦功能(可橡皮擦、可清除)
  8. java 计算 四分位,Java四分位计算方法
  9. 人工智能:从单细胞生物的智能说起
  10. Android中ListView数据处理优化
  11. Dart基础第1篇:Dart环境搭建、Dart开发工具
  12. 智能视频监控中的多目标跟踪分析
  13. [转载]ASP.NET-----Repeater数据控件的用法总结
  14. Atitit 计算机通信技术概要 目录 1. OSI参考模型将整个协议垂直地分为7个层次 : 1 1.1. 通信类别 2 2. 传输方式 计算机通信可分为直接式和间接式两种。 2 2.1. 1)直
  15. Android中控件设置英文文本内容时区分大小写
  16. RecyclerView通用适配器
  17. 【GamePlay】UGUI的注意事项
  18. [JS] canvas 详解
  19. 牛顿法和割线法方程求根(C语言)
  20. 人生感悟--条条经典

热门文章

  1. Unity3D+SignalR实现实时数据传输
  2. Unity添加GIF动画
  3. 那些年,我们用过的服务器软件
  4. Flutter 项目实战 Dio网络请求 四
  5. 工业机器人-基于伺服电机的PMSM控制系统硬件电路设计
  6. 视频处理软件有那些,优缺点介绍
  7. 中国名人名言网今天在天csdn开通了
  8. 图解SQL SERVER 2008R2安装与配置
  9. 2D转换之旋转与缩放
  10. JS中字符串操作方法