Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

时间:2022-09-21 14:25:39

系统1:ThinkPad T570、Windows10、QT5.12.2(Qt Creater 4.8.2)
一、动态库.dll的创建和调用
1.在qtcreater中按如下步骤创建动态库,动态库名为mydll:

选择Library项目,C++库Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
选择共享库:Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
选择qt自带的kit:
Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
在工程中自动生成的mydll.pro文件里内容如下:

#-------------------------------------------------
#
# Project created by QtCreator 2019-04-05T11:14:57
#
#------------------------------------------------- QT -= gui #在选择需要的模块时,我只选用了QtCore,没有使用QtGui TARGET = mydll #我配置的动态库的名字:mydll
TEMPLATE = lib #生成库时该字段为lib;生成执行文件时为:app DEFINES += MYDLL_LIBRARY #将MYDLL_LIBRARY添加为编译时的预处理器宏,在share_global.h中使用 # 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.0 SOURCES += \
mydll.cpp HEADERS += \
mydll.h \
mydll_global.h unix {
target.path = /usr/lib
INSTALLS += target
}

mydll.h文件内容如下编写,其中我只添加了sum和squaresum两个函数定义,其他的为自动生成:

#ifndef MYDLL_H
#define MYDLL_H
#include "mydll_global.h"
class MYDLLSHARED_EXPORT Mydll
{
public:
Mydll();
int sum(int a,int b);
int squaresum(int a,int b);
};
#endif // MYDLL_H

mydll_global.h文件为自动生成,在此不多描述。

mydll.cpp文件中如下编写:

#include "mydll.h"
Mydll::Mydll()
{
}
int Mydll::sum(int a, int b)
{
return (a+b);
}
int Mydll::squaresum(int a, int b)
{
return (a*a+b*b);
}

随后按Ctrl+B键来构建该项目,构建成功后会在工程文件所在的同级目录下生成build-mydll-Desktop_Qt_5_12_2_MinGW_64_bit-Debug文件夹,该文件夹内有libmydll.a,mydll.dll和mydll.o三个文件,我们需要用的是mydll.dll。

2.在qtcreater中按如下步骤创建使用动态库的工程,工程取名为UseLib。

Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
将mydll.h和mydll_global.h两个文件从mydll项目文件夹中拷贝到UseLib工程源文件夹下(F:\QTCode\TestCode\TestLib\uselib\UseLib)
在mainwindow.h文件中添加动态库的头文件#include “mydll.h”,并定义一个动态库类对象Mydll mylib,代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mydll.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
Mydll mylib;
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

将mydll项目中生成的mydll.dll文件放到UseLib工程源文件夹下。
在UseLib.pro文件的最后一行添加如下代码,将动态库包含进当前项目:

LIBS +=-L$$PWD -lmydll    # $$PWD表示当前路径,mydll根据生成动态库的工程的mydll.pro里面的TARGET = mydll得到
  • 1

mainwindow.ui如下图布局:
Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
mainwindow.cpp如下编写代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
int a = ui->lineEdit1->text().toInt();
int b = ui->lineEdit2->text().toInt(); int nsum = mylib.sum(a,b);
QString str = QString::number(nsum);
ui->lineEditsum->setText(str);
}

运行结果如下:
Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

二、静态库.a的创建和调用
步骤与动态库几乎相同,除了如下几点:
1.创建静态库的名字为mylib,选择类型为“静态链接库”,如下:Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
2.静态库里面还是一个sum(int a,int b)的方法,静态库创建完之后,在构造出的“build-mylib-Desktop_Qt_5_12_2_MinGW_64_bit-Debug\debug”文件夹下会生成libmylib.a和mylib.o文件,我们要用的是libmylib.a文件。
3.创建使用静态库的工程,取名为uselib,将libmylib.a和mylib.h拷贝到项目源文件路径下和构造路径下
4.在uselib.pro中的最后一行添加

LIBS +=-L$$PWD -lmylib
  • 1

5.在mainwindow.h中添加#include “mylib.h”,并定义一个类对象Mylib mylib;

  #ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mylib.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
Mylib mylib;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

6.在mainwindow.cpp中添加如下代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
int a = ui->lineEdit1->text().toInt();
int b = ui->lineEdit2->text().toInt();
int nsum = mylib.sum(a,b);
QString str = QString::number(nsum);
ui->lineEditsum->setText(str);
}

运行结果如下:

Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

注:linux下按照如上流程创建和调用静态库 亲测成功过,用的系统为
硬件:NVIDIA Tegra X2
系统:Ubuntu 16.04LTS
QT版本:QT5.5.1(Qt Creater 3.5.1)
但在linux下调用动态库的时候会失败,具体后续我会再研究一下。

Qt生成和调用动态库dll,和静态库.a(windows和linux通用)的更多相关文章

  1. C&sol;C&plus;&plus; 关于生成静态库(lib&rpar;&sol;动态库&lpar;dll&rpar;文件如何使用&lpar;基于windows基础篇&rpar;

    1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...

  2. Eclipse下生成&period;dll动态库及&period;a静态库使用 for Windows &lbrack;z&rsqb;

    以后的主要工作就是做库了,将我们的C或者C++写的接口做成库,给客户端使用,因此有必要知道库的使用和制作方法.主要是在Eclipse下搞了搞,公司用的是Carbide,也差不多.库做好了,用SVN已提 ...

  3. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  4. iOS 静态库和动态库的区别&amp&semi;静态库的生成

    linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...

  5. iOS XCode7制作&period;Framework动态库和&period;a静态库的总结

    一.开发SDK时的支持情况: OC语言制作动态库时,支持iOS8+:OC语言制作静态库,支持iOS7+. Swift语言制作动态库时,支持iOS8+;Swift不支持静态库. 对于SDK来说,支持情况 ...

  6. centos 目录结构 快捷键 ls命令&comma;alias别名&comma;so:动态库 a:静态库&comma;环境变量PATH&comma;Ctrl&plus;z 暂停命令&comma;Ctrl&plus;a 光标到行首&comma;Ctrl&plus;e 光标到行尾&comma;Ctrl&plus;u 删除光标前所有字符 Ctrl&plus;r 搜索命 hash命令 Ctrl&plus;左箭头&sol;右箭头 cd命令 第三节课

    centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标 ...

  7. iOS&colon;Xcode7下创建 &period;a静态库 和 &period;framework静态库

    Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...

  8. iOS开发中静态库之&quot&semi;&period;framework静态库&quot&semi;的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  9. QT中添加 动态库&lpar;&period;so&rpar; 和 静态库 &lpar;&period;a&rpar; 的方法

    在QT 的Makefile文件中: 1 添加动态库,如lipcap.so 则,在LIBS一行中添加“-L/usr/local/lib -lpcap”,依据自己的情况修改libpcap.so的路径 2 ...

随机推荐

  1. GCC&comma;GDB&comma;Makefile和IO复用函数

    2015.1.22 c高级的环境搭建:GCC编译器:全称 GNU CC,是GNU工具(tool chain)的一种,源码编译成机器码,gcc的编译依赖于很多小工具4.3.3和3.4.3版本的比较稳定 ...

  2. 在AE中通过SDE添加图层&lpar;转&rpar;

    public void AddSDELayer(bool ChkSdeLinkModle)        {            //< span style="color: #00 ...

  3. P140、面试题24:二叉搜索树的后序遍历序列

    题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 测试用例: 1)功能测试(输入的后序遍历的序列 ...

  4. SQL Server服务启动失败,错误代码:10048

    今天打开电脑后遇到了一个奇葩的问题,启动Sql Server服务时,出现如下图所示错误:

  5. javascript 兼容各个浏览器的事件

  6. C&num; var 隐式类型 var 用法 特点

    var 关键字是C# 3.0 开始,在方法范围中声明的变量: var有以下特点: * 1.var在编译器编译的时候根据初始值推断出其的类型          * 2.不能赋值除了初始值类型之外的其他类 ...

  7. Django 相关

    Web框架本质 其实所有的Web应用本质就是一个socket服务端,而用户的浏览器就是一个socket客户端.简单的socket代码如下: import socket sk = socket.sock ...

  8. Python BeautifulSoup 使用

    BS4库简单使用: 1.最好配合LXML库,下载:pip install lxml 2.最好配合Requests库,下载:pip install requests 3.下载bs4:pip instal ...

  9. 自学Aruba5&period;3&period;3-Aruba安全认证-有PEFNG 许可证环境的认证配置Captive-Portal

    点击返回:自学Aruba之路 自学Aruba5.3.3-Aruba安全认证-有PEFNG 许可证环境的认证配置Captive-Portal 1. Captive-Portal认证配置前言 1.1 新建 ...

  10. 【Unix网络编程】chapter8基本UDP套接字编程

    chapter8基本UDP套接字编程 8.1 概述 典型的UDP客户端/服务端的函数调用 8.2 recvfrom和sendto函数 #include <sys/socket.h> ssi ...