QT 静态库和动态库的使用方法
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 静态库和动态库的使用方法相关推荐
- QT添加库(静态库和动态库)
QT添加库(静态库和动态库) 添加动态库(dll库)的方法:** 就是把所有需要的dll库全部放到exe所在文件夹,和exe处于同一级目录下. 添加静态库(lib库)的方法: 1.右键项目文件,点击添 ...
- C++基于QT创建并使用静态库和动态库
如果这个宇宙里没有你所爱的人,那还算什么宇宙. -- 斯蒂芬 · 威廉 · 霍金 之前写了一篇文章(C++初始动态库和静态库)简单介绍了一下C++静态库和动态库的特点,今天来说一下使用QT这个开发工具 ...
- Qt 静态库和动态库
Qt 静态库和动态库 创建和使用静态库 创建静态库 使用静态库的文件 创建和使用动态库 创建动态库 使用动态库 隐式链接调用共享库 显示调用 创建和使用静态库 创建静态库 1.选择新建文件和项目.=& ...
- 包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用
引言:vs中怎么添加外部头文件? 如过直接在项目头文件处,添加一下,如下图: 否则,依然会报错,如下图: 有两种方法,来解决(你不在vs上的添加它也没事): (1) 直接把外部头文件复制过来,放在此项 ...
- [学习备忘录]Linux平台静态库、动态库的一些笔记
先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...
- PHP编译为静态库,makefile生成静态库和动态库
库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...
- 关于Linux静态库和动态库的分析
From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...
- C/C++ 静态库和动态库的区别
可执行目标文件 可重定位目标文件 共享目标文件 静态库和动态库的区别: 生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中:动态库是在程序运行过程中指定路径或者系统动态库路径下寻找. -l ...
- 静态库与动态库详细剖析
技术交流QQ群:1027579432,欢迎你的加入! 1.库的介绍 库是什么? 二进制文件: 将源代码(.c或.cpp文件)变成二进制格式的源代码: 加密操作(只能使用,无法知道源代码是什么): 库制 ...
最新文章
- CentOS 6.2 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
- Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化-[Android取经之路]
- 反射学习笔记之动态创建对象和调用方法
- launch mysql_Mac Pro 开机自启动 PHP-FPM,Nginx,MySql 等软件
- JS使用XMLHttpRequest对象POST收发JSON格式数据
- 论文笔记之:Deep Attention Recurrent Q-Network
- 画布上涂鸦功能(可橡皮擦、可清除)
- java 计算 四分位,Java四分位计算方法
- 人工智能:从单细胞生物的智能说起
- Android中ListView数据处理优化
- Dart基础第1篇:Dart环境搭建、Dart开发工具
- 智能视频监控中的多目标跟踪分析
- [转载]ASP.NET-----Repeater数据控件的用法总结
- Atitit 计算机通信技术概要 目录 1. OSI参考模型将整个协议垂直地分为7个层次 :	1 1.1. 通信类别	2 2. 传输方式 计算机通信可分为直接式和间接式两种。	2 2.1. 1)直
- Android中控件设置英文文本内容时区分大小写
- RecyclerView通用适配器
- 【GamePlay】UGUI的注意事项
- [JS] canvas 详解
- 牛顿法和割线法方程求根(C语言)
- 人生感悟--条条经典