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

相关文章

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置