QT Windows和Linux下,Qt Creator创建动态库和调用动态库(.dll 和 .so)_qt编写既能在linux又能在windows下面使用的库文件-程序员宅基地

技术标签: Linux  Linux QT调用动态库(.so)  Linux环境下,Qt Creator创建动态库  Qt开发  qt 创建和调用动态库  Windows环境下,Qt Creator创建动态库  Windows QT调用动态库(.so)  

简述

Windows下动态链接库是.dll文件,静态链接库文件是.lib文件。Linux下动态库是.so文件。

Qt嵌套在visual studio时,编译器是MSVC,而Qt Creator的编译器是MinGW,针对MSVC和MinGW这两种编译器,作个简单的介绍:

  • MSVC是指微软的VC编译器。
  • MinGW是指是Minimalist GNU on Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时库。

他们都是很好用的编译工具,但是他们兼容的并不好。当你的项目使用MinGW编译的使用,想要用一个MSVC编译生成的库时就会有问题。使用MinGW编译项目的时候,所使用的Lib也要是MinGW编译的。如果你只是开发Window平台的软件时,最好用Qt MSVC组合,这样可以使用大量的第三方lib,还有很多的构建指令,毕竟window上MSVC才是王道。 编码的问题,QT5的Qstring默认是UTF8格式,QT5极力推介把源码用UTF8格式存储。 但是MSVC只支持带BOM的UTF8格式,qmake不支持带BOM的UTF8格式,逼我只能用GBK么。这样的话,用qt5,每次都要Qstring::fromLocal8bit(“我是中国人”);况且就算BOM问题解决了,源代码是UTF8了。MSVC的执行编码也是GBK。【此段参考链接如下:https://yq.aliyun.com/wenji/242316

正文

我使用的环境是:ubuntu 16.04(64位) + qt5.7.1 。在安装环境时碰到了一点小问题,这里说一下。目前高版本QT的Linux安装包都是64位,所以需要在64位Linux系统下才可以安装,否者是不可以运行的。我找了一些低版本的QT安装包,例如“qt-creator-opensource-linux-x86_64-4.0.1.run”,带有“x86_64”字母,将此安装包在32位Linux下运行,也是失败的,随后我查看了此安装包信息,发现也是只支持64位系统的,苦逼的我只能装个64位Linux系统了。【好像以前QT版本都是有32位的安装包的,例如“qt-creator-opensource-linux-x86-4.0.1.run”,但是我确实没找到,如有大神知道在哪能下载,麻烦给我留言,感激不尽!】

创建动态库步骤

(1)创建共享库项目

  • 创建项目,选择Library -> C++库,下一步

  • 选择“共享库”,输入项目名,下一步

  • 在选择模块是,选择“QtCore”和“QtGui”模块,下一步

  • 一直下一步,直至完成项目的创建
  • 项目创建完成后,会看到三个文件:rsadecode.h、rsadecode.cpp、rsadecode_global.h。其中“rsadecode”是项目名称。其中rsadecode_global.h头文件中包含的是动态库对外接口宏定义【注意,与visual studio中动态库对外接口宏定义“_declspec(dllexport)”不一样哦】

  • rsadecode.h头文件是对外接口文件,动态库中需要被调用的接口,都是从这里出去的。

(2)修改代码

在rsadecode.h的类中添加需要对外的接口,然后在rsadecode.cpp中实现,就可以了。

rsadecode.h 

#ifndef RSADECODE_H
#define RSADECODE_H

#include "rsadecode_global.h"
#include "RSADecode_Sub.h"  //这是我添加的其他类,不用考虑它

class RSADECODESHARED_EXPORT RSADecode
{

public:
    RSADecode();
    bool CheckKey(char *name, char* dstKey);
};

#endif // RSADECODE_H

rsadecode.cpp

#include "rsadecode.h"
#include <QDebug>

using namespace std;

static RSADecode_Sub rsa;

RSADecode::RSADecode()
{
//    qDebug()<< "Hello";
}

bool RSADecode::CheckKey(char *name, char* dstKey)
{

//    qDebug() << "CheckKey";
//    char *fileName = name;
//    char* macStr;
    rsa.DecodeRSA(name, dstKey);
//    dstKey = (char*)macStr;
//    qDebug() << "解密后的字符:\n";
//    qDebug() << dstKey;
    return true;
}

(3)编译项目,生成动态库

  • 完成接口编码,开始“重新构建”项目。
  • 如果是 Linux 系统,在项目的运行文件目录debug(或release)下可以看到编译的.so文件。

  • 其中我们只需要和项目名相关的四个.so文件就可以了,即前4个文件。
  • 如果是 Windows 系统,在项目的运行文件目录debug(或release)下可以看到编译的.dll文件。

  • 至此,完成了动态库的生成操作。

调用动态库步骤

(1)创建一个项目(控制台项目或者界面项目都可以)

(2)Linux系统,在项目的根目录下创建文件夹include和so,分别存放动态库的所有头文件和so文件。

(3)Linux系统,修改项目的pro文件,添加include和so文件目录,如下:

INCLUDEPATH += /home/server/TestDLL/include/

LIBS += -L/home/server/TestDLL/so -lRSADecode

其中,INCLUDEPATH包含动态库头文件,LIBS包含动态库文件,-L后加上需要添加的目录(中间无空格),-l指定共享库名称(注意:共享库项目名而非共享库文件名

(4)Windows系统,在项目的根目录下创建文件夹include和DLL,分别存放动态库的所有头文件和dll文件。

(5)Windows系统,修改项目的pro文件,添加include和DLL文件目录,如下:

INCLUDEPATH += E:\QTProject\ColorSelector\include\

LIBS += -LE:\QTProject\ColorSelector\DLL -lRSADecode

其中,INCLUDEPATH包含动态库头文件,LIBS包含动态库文件,-L后加上需要添加的目录(中间无空格),-l指定共享库名称(注意:共享库项目名而非共享库文件名

(4)在需要调用动态库里方法的文件中,包含“rsadecode.h”,实例化RSADecode类,调用接口。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "rsadecode.h"  //包含动态库对外的头文件

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    //实例化RSADecode类
    RSADecode m_rsa;

    char macStr[50];
    memset(macStr, 0, sizeof(macStr));
    //调用动态库里的接口
    m_rsa.CheckKey(fileName, macStr);
}

(5)编译运行项目,即可实现调用动态库。至此所有步骤已完成。

参考链接:https://www.cnblogs.com/techiel/p/8035014.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27278957/article/details/95945638

智能推荐

CMake编译项目集成Gcov/Lcov代码覆盖率测试_lcov覆盖率 cmake-程序员宅基地

文章浏览阅读8.7k次,点赞4次,收藏15次。原文链接:http://blog.yeyuzhen.cn/?p=203_lcov覆盖率 cmake

电池包预充RC电路仿真_电池bms预充电阻及预充时间的计算simulink-程序员宅基地

文章浏览阅读1.1k次。电池包在设计BDU 的时候 预充电阻计算计算方程: T = RC * Ln[(Vbatt - V0)/( Vbatt - Vpre)] 注:T为预充电时间,R为预充电阻,C为外部电容,Vbatt为电池包电压,V0为负载端闭合高压前..._电池bms预充电阻及预充时间的计算simulink

使用curl在命令行中下载文件_bat脚本 curl 下载文件夹下所有文件-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏5次。今天帮同学从一个网站上下载点数据, 但是上面有上百个链接, 一个一个点击下载实在是工作量太大。 于是自己就想找一个命令行下载工具并用Python写一个简单的脚本来替代这些工作。百度了一下, 找到了curlcurl: curl是利用URL语法在命令行方式下工作的文件传输工具。 [百科: http://baike.baidu.com/view/1326315.htm]官网: http:_bat脚本 curl 下载文件夹下所有文件

常用的原型开发工具-程序员宅基地

文章浏览阅读67次。1、Axure RP(Rapid Prototyping)Axure(读音为Ack-Sure)无疑是目前最受关注的原型开发工具,其能通过组件的方式帮助网站或软件设计师快速建立带有注释的原型(流程图、线框图),并凭借自定义可重用的元件、动态面板以及丰富的script能够建立基本功能或页面逻辑的动态演示文件。Axure借鉴了office的界面,能够让用户快速上手,并且提供了..._程序员原型法常用工具

nuiapp请求网络_uni-app 接口 - 网络请求-程序员宅基地

文章浏览阅读145次。1、 uni.request(OBJECT) 发起网络请求参数名 类型 必填 默认值 说明url String 是 开发者服务器接口地址data Object/String/ArrayBuffer 否 请求的参数header Object 否 设置请求的 header,header 中不能设置 Referer。method String 否 GET (需大写)有效值:OPTIONS, GET...

随便推点

杭州程序员对薪酬最满意,上海程序员最辛苦...原来我们是这样的程序员_杭州软件比上海-程序员宅基地

文章浏览阅读6.3k次,点赞5次,收藏9次。最近,极光大数据根据极光调研平台收到的1684份有效问卷,发布了一份2018年3月中国程序员研究报告,涉及了程序员工作和生活等方方面面,现在笔者与大家分享一下:生活中的程序员婚恋篇七成程序员处于未婚状态,其中四成程序员为单身22-30岁的程序员中,只有19.3%已完成结婚生子的人生大事,在主要职业群体中比例为最低。看来说程序员是大龄青年的聚集地,此言非虚。42%的22-30岁受访程序员目前是单身。..._杭州软件比上海

Unity Shader - 在 URP 获取 Ambient(环境光) 颜色_unity ambient-程序员宅基地

文章浏览阅读4.4k次,点赞5次,收藏19次。之前在 Unity Built-in 管线中,我们在自定义 shader 中,可以使用一下代码来获取 Ambient 环境光的颜色:fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb但是在 Unity URP 中,发现不生效了,虽然 URP 中也有定义这个宏,定义在:#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityInput.hlsl" 中 #define UN_unity ambient

TCPIP详解卷1第3章IP网际协议3.2IP首部3.3IP路由选择-程序员宅基地

文章浏览阅读164次。转载于:https://www.cnblogs.com/sunyongjie1984/p/4319969.html

linux which,whereis,locate,find的区别_linux中whereis locate which的区别-程序员宅基地

文章浏览阅读221次。find就不用多说了,就是递归遍历文件夹。which:有时候可能在多个路径下存在相同的命令,该命令可用于查找当前所执行的命令到底是哪一个位置处的命令。whereis:是在数据库中查找文件,在数据库(var/lib/slocate/slocate.db)中查找与文件名相匹配的二进 制文件、源文件和帮助手册文件,使用之前可以使用up..._linux中whereis locate which的区别

olat中解决查看gui_demo源代码异常或debug模式下查看源代码异常_guidemo_main不显示-程序员宅基地

文章浏览阅读1.2k次。出现这种异常是因为没有设置 project.build.home.directory 参数,系统找不到源代码文件的位置。解决办法:1.首先下载源代码,可参考如何下载olat源代码并在eclipse中查看2.在部署的服务中找到 olat.local.properti_guidemo_main不显示

自定义View-Rect和RectF_android根据rect坐标添加控件-程序员宅基地

文章浏览阅读1.4k次。Rect 类定义了一个矩形结构,同样实现了 Parcelable 序列化接口。Rect 类定义了 left、top、right、bottom 四个成员变量,我们需要正确理解这 4 个成员变量的作用:left:矩形左边线条离 y 轴的距离top:矩形上面线条离 x 轴的距离right:矩形右边线条离 y 轴的距离bottom:矩形底部线条离 x 轴的距离矩形是一种非常常见的图_android根据rect坐标添加控件

推荐文章

热门文章

相关标签