Linux下Qt创建共享库与链接共享库详解

Qt 之创建并使用共享库 在 Windows 中,有动态链接库(DLL - Dynamic Link Library);在 Linux 中,有共享库(Shared Library),它们是相同的! 阅读详情

点击上方蓝字可关注公众号,方便下次阅读与联系~

随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库;或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库。本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的方法。

 

共享库是在Linux下的称呼,在Windows下被称为动态库。这块大家需要了解的是程序在编译时使用的库和程序在运行时使用的库需要一致,不然程序可能会闪退。而且运行时库的路径如果没有设置,那么系统就会在默认的路径下进行搜索,如果没找到程序直接就挂了。之后的文章会进行总结说明的。

 

程序平台:Ubuntu14.04、 Qt5.5.1

 

一、Qt 创建共享库

 

1. 创建类型为库的Qt工程

 

① 新建工程-> Library -> C++ 库:

②类型选择默认的共享库,填写名称并选择工程路径。简单说下库的类型分别是动态库、静态库和Qt的插件

③选择默认的套件即可

④选择所需模块,这里我没有勾选任何模块

⑤设置类的基本信息

⑥完成向导

2. 工程文件

 

①工程创建完成后,删掉了Qt生成的一些文件,文件目录如下

② .pro 文件的修改,添加版本号的设置等

QT       -= core gui
TARGET = TestLibTEMPLATE = lib
VERSION += 1.1.0
CONFIG += debug_and_releaseCONFIG(debug, debug|release) { unix: TARGET = $$join(TARGET,,,_debug) else: TARGET = $$join(TARGET,,,d)}
DEFINES += TESTLIB_LIBRARY
SOURCES += addlib.cpp
HEADERS += addlib.h
unix { target.path = /usr/lib INSTALLS += target}

TARGET             : 库的名称

TEMPLATE           :模板类型,类型为lib ,即生成的是一个库文件

VERSION(新增部分)   :库的版本号设置

CONFIG (新增部分)   :控制编译的Debug与Release库的版本名称

 

1. 生成共享库

该共享库实现了计算两个整型数和的功能,过于简单,莫要介意~

 

① .h文件内容

#ifndef ADDLIB_H#define ADDLIB_H
class AddLib{
public: AddLib();
int myAdd(int x, int y);};

② .cpp内容

#include "addlib.h"
AddLib::AddLib(){}
int AddLib::myAdd(int x, int y){ return x + y;}

③构建与运行

只构建的话就会直接生成共享库,如果运行的话就是下面这个样子。

④生成动态库效果

到这里我们就已经生成好了动态库,可以看下我们添加的动态库的版本号。

注意,我这里没有区分Debug与Release版本。

二、链接动态库

1. 创建工程添加文件

创建一个继承QWidget的应用程序后,在与.pro文件同级目录下添加一个如下目录组织的文件:

main.cpp

***.pro

Lib/

 test/

  linux_x32/

    Include/

      addlib.h

    lib/

      libTestLib.so**

 

2. 借助Qt添加库

①右键项目->添加库

②选择链接库的类型,选择【外部库】

③选择链接库的路径与平台等信息

④ .pro中新增文件

 

unix:!macx: LIBS += -L$$PWD/Lib/test/linux_x32/lib/ -lTestLib

 

INCLUDEPATH += $$PWD/Lib/test/linux_x32/include

DEPENDPATH += $$PWD/Lib/test/linux_x32/include

$$PWD       :用于指定包含.pro文件目录的完整路径

INCLUDEPATH :指定了编译项目时被搜索到的 #include 目录

LIBS          :指定了链接到项目中库的列表

⑤修改后的.pro文件

实际项目中我们的库可能会用到多个平台,所以一般创建如下

unix{    contains(QT_ARCH, i386){
INCLUDEPATH += $$PWD/Lib/test/linux_x32/include LIBS += -L$$PWD/Lib/test/linux_x32/lib -lTestLib
} contains(QT_ARCH, x86_64){
}
}else{ contains(QT_ARCH, i386){

}
contains(QT_ARCH, x86_64){ #64bit
}}

3. 测试程序的编写

① .h

#ifndef WIDGET_H#define WIDGET_H
#include <QWidget>
#include "addlib.h"
namespace Ui {class Widget;}
class Widget : public QWidget{ Q_OBJECT
public: explicit Widget(QWidget *parent = 0); ~Widget();
private slots: void on_pbn_testAddLib_clicked();
private: Ui::Widget *ui;
AddLib m_addLib;};
#endif // WIDGET_H

②.cpp

#include "widget.h"#include "ui_widget.h"


#include <QDebug>
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this);

}
Widget::~Widget(){ delete ui;}
void Widget::on_pbn_testAddLib_clicked(){ int x = ui->le_x->text().toInt(); int y = ui->le_y->text().toInt();
int ret = m_addLib.myAdd(x,y);
ui->le_ret->setText(QString::number(ret));
qDebug() << "add ret is :" << ret;}

③程序功能及运行效果

UI输入两个数字,点击按钮后通过共享库计算,如下:

三.后记总结

1. 使用共享库问题与解决方法

 

以前在使用共享时,报了一个这样的错误:

error while loading shared libraries: libTestLib.so.1: cannot open shared object file: No such file or directory

 

加载共享库时失败,没找到。那会儿的解决办法是把共享库拷贝到 usr/local/lib下,这样问题就没有了,拷贝后要使用ldconfig命令。

上面的错误是在运行时没有找到共享库,在Linux下,可以使用 ldd命令查看一个可执行程序所需的库,效果如下:

2. 为什么在Qt中运行没有报上面的错误?

由于以前使用共享库遇到过上面的问题,但是在刚刚测试共享库的时候,为什么没有报错呢?是Qt将生成的共享库放到Linux默认的搜索路径下了么?

于是我使用了locate +库名 命令进行搜索,但是并没有在其他路径下发现刚刚生成的共享库;于是我又去找配置Linux环境变量的文件,发现也没有。root下,在/etc/ld.so.conf.d文件下查看。

然鹅我并没有放弃,于是借助谷歌,搜索了下相关问题【Qt 编译工程的过程】,虽然没有找到答案,但是发现了一些线索:

在Projects中的Run Environment 下的LD_LIBRARY_PATH对应的Value里面,我看到了在程序中链接库的目录。至此,我觉得我找到了原因。

 

3. 小结中的小结

通过对一个问题的求解,我们顺藤摸瓜的会学习到很多其他知识。像本次就知道几个Linux命令的使用场景。

往期精彩回顾:Qt配置文件之XML

              Modbus 调试助手的使用

                     用Python 写 Modbus

                     Qt 项目之中国象棋

欢迎大家关注公众号:Pou光明

YOLOv11的QAT(训练感知量化)实战 本文总结了YOLO模型量化感知训练(QAT)的实践要点:QAT通过模拟量化噪声训练模型,比训练后量化(PTQ)更适合密集预测任务。关键实现包括:1)配置对称/非对称量化器;2)排除检测头量化;3)调整学习率策略并添加量化正则;4)选择困难样本校准;5)转换前稳定BN统计量。调试时需检查量化范围、数值分布和逐层突变,并注意SPP等敏感层。建议小模型使用QAT,大模型可能适得其反,且TensorRT的FP16模式可能优于INT8-QAT。量化应以功能正确为前提,避免过度优化。 阅读详情

相关推荐

大数据实战:Python与MySQL在足球赔率分析中的高效应用

本文详细介绍了如何利用Python与MySQL进行大数据实战,实现足球赔率的高效分析。通过对比Excel处理的局限性,阐述了数据库在处理百万级数据时的速度优势。文章提供了从环境搭建、使用pymysql连接数据库、利用pandas进行数据清洗与分析,到构建自动化分析系统的完整流程,旨在帮助读者将大数据技术应用于实际业务场景,显著提升数据处理与洞察效率。

weixin_29080843的博客 448

linux下qt打印功能如何实现,QT实现操控打印机打印图片

开发环境:windows+QT5.9给个前提:你的电脑需要能有连接打印机,并且能够打印,做这个程序前,先确保打印机连接到你的电脑能够进行打印。这样程序写好,测试时候只要不能打印,就是程序问题。最近有个任务是用QT写个界面通过点击按钮,实现连接打印机打印出QT某个控件中的图片,代码实例(部分)该段代码,是一个按钮点击事件,点击直接进行打印机打印操作,各种设置,比如纸张大小,显示位置都已经设置死,不可...

weixin_33148993的博客 2533

Jupyter Notebook 命名出现“error”且运行后没反应

Jupyter Notebook 命名出现“error”且运行后没反应提前声明错误截图(方便大家看看是不是自己的错误)解决方法 提前声明 我的问题是在看到答主 @开始King的回答后才解决的,因为答主大大的文章后面有些地方不是很详细,我在这里再在King大大的基础上完善一下子 错误截图(方便大家看看是不是自己的错误) 1.命名失败,上面出现一个“error”字样 2.运行失败,无论是点击上方的运行按钮还是按快捷键shift+enter 都只会向下再增加一个代码块,而不会运行程序。 (也不是很多人出现的[*

qq_52770743的博客 1万+

QT5 Qbs编译系统下添加打印机支持模块

最近学习QT5开发及实例(陆文周)第四版,从中用到了打印机 由于原文使用的是qmake,本人电脑系统使用时间较长,用qmake有bug,后发现使用Qbs能正常编译 使用打印机打印文字的代码如下 void ImgProcessor::ShowPrintText() { QPrinter printer; //新建一个QPrinter对象 QPrintDialog printDialog(&printer,this); //(a) if(printDialog

qq_27826857的博客 642

基于OpenSSL的CA建立及证书签发(签发多域名/IP)

自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 系统版本:CentOS Linux release 7.6.1810 (Core) OpenSSL版本:OpenSSL 1.0.2k-fips 26 Jan 2017 【前言】 在基于OpenSSL的CA建立及证书签发一文中(后面统.

hobby云说 4647

拆解大疆Osmo Pocket:聊聊微型云台里那几根比头发丝还细的线,以及它为啥一开机就‘摇头晃脑’

本文深入拆解大疆Osmo Pocket微型云台的精密硬件结构,揭秘其开机自检时‘摇头晃脑’的奥秘。通过分析无刷电机、霍尔传感器和46AWG同轴线等核心组件,展现了大疆在微型云台设计中的工程智慧与创新技术,特别是FOC控制和陀螺仪的应用,实现了0.1°级的姿态控制精度。

weixin_27869497的博客 670

linux qt调用共享库,Linux下Qt创建和调用共享库文件.so

Linux下Qt创建和调用共享库文件.so费了点功夫,总算get了编写共享库(Shared Library,Windows下称为“动态链接库”,即Dynamic Link Library)和调用的这个新技能!动态链接库的好处是不言而喻的,一个稍微复杂一点的程序,顶层设计的时候良好的类库划分可以让工作变得很简单,而将不同类编译成共享库文件可以实现程序的模块化,提高代码复用程度,在保证接口兼容的情况下...

weixin_33622128的博客 590

使用 MATLAB/Simulink 构建一个 核电站汽轮机与发电机协调控制系统 的仿真模型

在核电机组中,汽轮机-发电机系统是将核能最终转化为电能的关键环节。与火电机组不同,核反应堆的热惯性大、功率调节慢,因此汽轮机的控制策略需与反应堆特性相匹配,实现安全、稳定、高效的能量转换。维持发电机输出功率/频率稳定(响应电网调度)调节汽轮机进汽压力(匹配一回路蒸汽供应)实现“堆-机协调控制”保障机组在启停、变负荷、甩负荷等工况下的安全性本教程将带你使用构建一个核电站汽轮机与发电机协调控制系统汽轮机调速系统(调门控制)建模发电机与电网接口建模(同步机)

xiaoheshang_123的博客 188

Linux共享打印机手机打印,[分享]让linux和linux之间共享打印机

帖子我用我的台式机和我的本本之间组了一个小网络,但在共享打印机时,碰到了小小麻烦。网上及论坛里介绍的都是Linux和Windows之间的共享打印机方法。当然我可以做一个Samba服务器来共享打印机,但我的本本和台式机都是UBUNTU,为了共享一个打印机而专门搞一个Samba服务器,不值得。后发现,其实只要设置一下CUPS服务器就可以·实现Linux之间共享打印机了。我的方法如下:我的网络情况:一台...

weixin_35815036的博客 1292

Unity零基础到入门 ☀️| 轻松学会 Unity界面布局和简单实例——入门级!(^_−)☆

入门级Unity知识,一起加油呀!

努力前行,总会成为自己心中的那道光 1万+

46、搭建与配置FTP服务器全攻略

本文详细介绍了如何搭建与配置FTP服务器,以vsftpd为例,涵盖了FTP基础概念、安装步骤、服务控制、安全设置、用户权限管理、文件上传支持、互联网共享配置、客户端使用以及常见问题解决等内容。旨在帮助用户高效、安全地实现文件共享与管理。

time3的博客 88

Linux下Qt调用共享库文件.so

INCLUDEPATH添加了项目的目录,以便找到头文件,而LIBS添加的是共享库文件,-L添加目录,-l指定共享库名称。

lydstory123的专栏 302

Unreal5从入门到精通之如何在VR中使用3DUI

前面我们讲过《Unreal5从入门到精通之UMG的使用》一般制作游戏时,UI都是添加到屏幕视窗上面的,但是在制作VR时,我们往往需要制作一个3D的UI,放置在场景中,然后使用手柄的射线来和UI进行交互。今天我们就来讲解下,如何在VR中创作和交互3DUI首次操作会感觉好复杂,多多练习,当你熟悉了UE蓝图的操作后会发现,这只是一个常规的蓝图操作而已。祝大家在虚幻的学习过程中非常顺利。希望这篇博客对你有所帮助。

TxNet 1985

linux 没有那个文件或目录_Linux下Qt创建共享库与链接共享库详解

随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库;或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库。本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的方法。共享库是在Linux下的称呼,在Windows下被称为动态库。这块大家需要了解的是程序在编译时使用的库和程序在运行时使用的库需要一致,不然程序可能会闪退。而且运行时库的路径如果没有设置,那么系统...

weixin_39753674的博客 802

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

linux查看db2版本号_Linux下Qt创建共享库与链接共享库详解

随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库;或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库。本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的方法。共享库是在Linux下的称呼,在Windows下被称为动态库。这块大家需要了解的是程序在编译时使用的库和程序在运行时使用的库需要一致,不然程序可能会闪退。而且运行时库的路径如果没有设置,那么系统...

weixin_42515795的博客 585

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux qt编译c语言共享库

Qt Creator支持编译生成c++库,打开新建工程,根据创建向导,能够很快生成c++共享库的工程 创建向导上显示的是c++的库,c语言的库也同样能够生成,下面对生成c语言的共享库做个介绍 生成c共享库 1.首先按生成c++库的方式生成工程,过程就不罗列了,根据要求自行选择 创建完成后,生成以下几个文件 其中testclib是默认生成的类,TestClib_global.h是生成库需要的宏 2.把testclib.cpp后缀改为.c 3.删掉默认的类,添加自己的接口,每个接口前面

芒果黑的博客 1594

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Qt创建并使用共享库(.dll .so)

简述 在 Windows 中,有动态链接库(DLL - Dynamic Link Library);在 Linux 中,有共享库(Shared Library),它们是相同的! 由于平台和编译器的差异,输出的库文件也不同: 在 Windows 中,MinGW 将输出.a和.dll;MSVC 将输出.lib和.dll。 在 Linux 中,MinGW 将输出.so、.so.1、.so.1.0和.so.1.0.0-.lib .a和.so是导入库,它们有助于将我们的代码链接...

周杰伦 1776

linux qt调用共享库,使用qt创建和使用共享库

我是共享库的新手,所以我对如何创建/使用共享库有疑问,我正在使用Qt Creator和qt 5.4.2与Microsoft Visual C 11.0 Compliler.在我的项目中,我需要创建一个dll,它从外部库中调用函数(有.h,.lib,.dll可供使用).为了理解如何从库中导出/导入函数,我尝试用一​​个函数创建一个简单的库,并首先在另一个程序中使用它.阅读完不同的教程后,我设法创建了...

weixin_33291720的博客 461

Linux qt 下 动态链接库创建问题

qt中动态链接库叫共享库。 我使用的qt为 qt-4.8.6-arm 按照一般教程linux Qt 动态库制作以及使用方法写动态链接库时 ,会产生三个软连接和一个实体 libtestDll.so.1.0.0共享库文件和libtestDll.so、libtestDll.so.1、libtestDll.so.1.0这三个软链接。 在调用动态链接库时,拷贝libtestDll.so 拷贝不走,只能拷贝libtestDll.so.1.0.0 在这种情况下可以在测试程序中创建软连接到testDll的输出中,但这

u012719076的博客 1217

Qt之创建并使用共享库

所以,要确保正确的宏能够被调用(无论是编译共享库本身,还是在客户端使用共享库),通常通过添加一个特殊的头文件({projectName}_global.h)来解决,这就是 sharedlib_global.h 存在的原因。- 选择“共享库”,然后输入“名称”(这里以 SharedLib 为例),并选择“创建路径”:注意: “类型”下拉列表中有三个选项,分别是:共享库、静态链接库、Qt Plugin(Qt 插件)。.a 和 .so 是导入库,它们有助于将我们的代码链接到库中,并且在构建文件时需要。

hw5230的博客 1072

linux /usr/lib/共享库为何几乎都有链接(像是快捷方式)?

QT建立的共享库,输出的时候会有三个链接文件,有疑惑为什么要这么多文件呢?可能这么做有好处,就是可以随时切换库的版本吧。linux 共享库为什么要建立那么多link。

thanklife的专栏 1259

Qt之创建共享库(动态库)

@TOC 概述: 步骤如下: 1.创建一个动态库 2.创建App调用动态库 连接动态库的方法有三种: 1.今天介绍的一种 2.可以使用代码加载动态库(接下来的文章会做介绍) 3.可以右键工程进行添加共享库 创建动态库步骤图片: 此处说明下,图片中根据需要添加模块即可 下一步直到创建完成 库代码示例: .h #ifndef FANTASTLIB_H #define FANTASTLIB_H ...

weixin_43519792的博客 518

Linux下Qt创建和调用共享库文件.so

Linux下Qt创建和调用共享库文件.so费了点功夫,总算get了编写共享库(Shared Library,Windows下称为“动态链接库”,即Dynamic Link Library)和调用的这个新技能!动态链接库的好处是不言而喻的,一个稍微复杂一点的程序,顶层设计的时候良好的类库划分可以让工作变得很简单,而将不同类编译成共享库文件可以实现程序的模块化,提高代码复用程度,在保证接口兼容的情况下...

Julian197的博客 4313

linux环境QT做静态库,QT静态库的创建与使用

最近研究一下静态库的开发;最初学习的资料是:QT静态库的创建与使用(全网最细)_路漫漫其远,吾求索的博客-优快云博客_qt生成静态库建立一个静态库成功。如果同时打开静态库和运行程序调用,调式模式下,可以进入静态库的内部函数进行调试;

thanklife的专栏 2260

QT - Linux下动态库&静态库的创建及使用指南

本文介绍了Linux下Qt、动态库、静态链接库的创建以及使用的两种方法(显示链接及隐式链接),分享了在使用显示链接中遇到的坑及解决办法,希望能帮到大家。

Hsy的博客 9541

在linux系统,用QT开发环境,C++语言,做共享库工程如何做?

在完成共享库的开发后,您可以将其部署到其他应用程序中,并在需要时动态加载它。为此,您需要将生成的共享库文件放置在适当的文件夹中,并将相应的链接选项添加到应用程序的编译器选项中。注意,生成的共享库文件需要放置在指定的路径下,并在需要使用该库的程序中通过编译选项将其链接到程序中。1. 打开QT Creator,选择“新建项目”,在“非QT项目”下选择“库”;3. 在弹出的对话框中填写库的基本信息,如库的名称、版本号、作者等。2. 选择您想要创建的共享库类型,例如:动态共享库或静态共享库。

thanklife的专栏 1073
上一篇: Qt配置文件之Xml
下一篇: Qt(MinGW ) Windows下创建动态库
Pou光明
博客等级 码龄12年 3701粉丝 398原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值