Qt编译静态链接库和动态链接库(WindowsLinux)

2024-04-16 18:44

本文主要是介绍Qt编译静态链接库和动态链接库(WindowsLinux),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近需要在Linux中编译相关程序动态库,对相关经验总结。
使用到的工具为Qt5.13.2

QT编译

  • 1. WINDOWS
    • 1.1 静态库制作
    • 1.2 静态库的使用
    • 1.3 动态库制作
    • 1.4 动态库使用
  • 2. LINUX
    • 2.1 静态链接库
    • 2.2动态库
  • 附录
    • gcc 编译程序查找顺序:
    • Linux 程序运行时查找顺序:

1. WINDOWS

1.1 静态库制作

Windows下编译成的静态库为XXX.lib文件,而不会生成可执行文件

1.1.1 创建文件时选择模板为Library(库),选择C++ Library。选择相应的项目路径。

在这里插入图片描述

1.1.2在定义工程详情界面选择类型为Statically Linked Library(静态库),选择相应用到的Qt模块。

在这里插入图片描述

1.1.3选择相应的编译器并完成工程创建

在这里插入图片描述
1.1.4在创建的工程中完成类的创建

1.2 静态库的使用

1.2.1新建Qt Widgets Application工程

1.2.2在.pro所在文件夹中创建include文件夹,将静态库生成时生成的debug版本(StaticLibd.lib)和release版本(StaticLib.lib)以及头文件(staticlib.h)复制进来

在这里插入图片描述
1.2.3右键项目,选择添加库,
在这里插入图片描述

1.2.4选择外部库

在这里插入图片描述

1.2.5选择库文件为include文件夹下的release版本,包含路径自动填成include

在这里插入图片描述

1.2.6至此静态库配置完成,在需要使用的地方包含相应头文件,实例化相关对象,通过对象使用相关函数。

1.3 动态库制作

1.3.1动态库选择创建工程时选择类型为共享库(Shard Library)

在这里插入图片描述

1.3.2工程创建后,头文件处自动生成XXX_global文件定义如下,其中define TESTDLL_EXPORT Q_DECL_EXPORT为导出dll的宏定义

#ifndef TESTDLL_GLOBAL_H
#define TESTDLL_GLOBAL_H#include <QtCore/qglobal.h>#if defined(TESTDLL_LIBRARY)
#  define TESTDLL_EXPORT Q_DECL_EXPORT
#else
#  define TESTDLL_EXPORT Q_DECL_IMPORT
#endif#endif // TESTDLL_GLOBAL_H

1.3.3在testdll.h中 class TESTDLL_EXPORT TestDll声明了导出类

class TESTDLL_EXPORT TestDll
{
public:TestDll();
};

1.3.4编写相关类,编译运行生成相应dll文件。主要用到的是dll和lib文件。

在这里插入图片描述

1.4 动态库使用

1.4.1新建Qt Widgets Application工程,在.pro文件所在文件夹中创建include和lib文件夹,将生成的.h文件放入include文件夹中,生成的lib和dll文件放入lib文件夹中
1.4.2在.pro文件中添加以下代码

INCLUDEPATH += : 头文件(包含)目录。LIBS += :-L用来指定引入的lib文件的路径, -l 用于指定需要链接库的名称

在这里插入图片描述
1.4.3 在工程中包含相应头文件,实例化相关对象,并使用相关函数。

2. LINUX

2.1 静态链接库

2.1.1静态库创建

使用和Windows类似只不过生成文件为libXXX.a
在这里插入图片描述
2.1.2 静态库使用

在新建Qt Widgets Application工程后添加库,这里界面和Windows有所区别,类型默认为Linux。选择相应的libXXX.a文件,完成库的添加。
在这里插入图片描述

最后生成的工程文件夹如下,其中StaticLIbUser为运行文件,Linux系统无法直接双击运行,需要打开终端,通过命令行执行程序。
在这里插入图片描述

2.2动态库

2.2.1动态库创建
创建过程与Windows类似,使用过程有所区别。创建的生成文件如下
在这里插入图片描述
生成的libmyDll.so.1.0.0为Linux下的动态库。
在这里插入图片描述

2.2.2动态库使用

新建Qt Widgets Application工程,同Windows类似,新建include和lib文件夹,在.pro文件添加如下

INCLUDEPATH += $$PWD/include/LIBS += -L $$PWD/lib -l $$PWD/lib/libmyDll.so.1.0.0

在QtCreator中可以正常运行
但在终端使用命令行出现问题

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

原因是在运行时找不到相应的链接库,所以需要把libmyDll.so.1添加到Linux系统运行环境/lib中去。
即可正常运行

附录

gcc 编译程序查找顺序:

  1. gcc 编译时参数-L指定的路径
  2. 环境变量 LIBRARY_PATH
  3. 系统默认库位置 /lib /usr/lib

Linux 程序运行时查找顺序:

  1. gcc 编译时指定的运行时库路径 -Wl,-rpath
  2. 环境变量 LD_LIBRARY_PATH
  3. ldconfig 缓存 /etc/ld.so.cache

在终端中执行如下命令后可以正常运行程序。相当于Windows中给终端添加相应的环境变量

export LD_LIBRARY_PATH=/XXX/lib:$LD_LIBRARY_PATH  

也可以写入启动脚本,每次启动终端都会加载路径。

vi ~/.bashrc
#在文件最后添加如下内容
export LD_LIBRARY_PATH=/root/lib:$LD_LIBRARY_PATH 

开发动态库.pro文件中

TARGET = testDll    // 生成动态库的名字
CONFIG += plugin // 避免出现后面的版本号libtestDll.so.1.0.0

这篇关于Qt编译静态链接库和动态链接库(WindowsLinux)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909594

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C++ Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 通用API函数

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Qt多语种开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。 开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10 一.先用QtCreator创建一个简单的桌面程序 1.工程就随便命名“LanguageTest”,其他默认。 2.在设计师

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

Qt中window frame的影响

window frame 在创建图形化界面的时候,会创建窗口主体,上面会多出一条,周围多次一圈细边,这就叫window frame窗口框架,这是操作系统自带的。 这个对geometry的一些属性有一定影响,主要体现在Qt坐标系体系: 窗口当中包含一个按钮,这个按钮的坐标系是以父元素为参考,那么这个参考是widget本体作为参考,还是window frame作为参考,这两种参考体系都存在