Qt编译静态链接库和动态链接库(Windows&Linux)

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

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
  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一款跨平台的应用程序开发框架,支持WindowsLinux、macOS等操作系统。Qt可以通过静态编译和动态编译两种方式进行构建和部署。 静态编译是指将Qt库的代码编译进最终生成的可执行文件中,这样生成的可执行文件独立性较强,不依赖于系统中是否安装了Qt库。静态编译的优点是可移植性好,部署简单,无需担心用户环境中是否已安装相应的Qt版本。然而,静态编译会使得可执行文件的大小变大,占用较多的存储空间,而且在更新Qt库时,需要重新编译整个应用程序。 动态编译是指将Qt编译动态链接库(.so文件),在运行时需要通过动态链接库来加载并运行程序。动态编译产生的可执行文件较小,因为它只包含应用程序的逻辑代码,依赖于系统中已经安装的Qt库。动态编译的优点是减少了可执行文件的大小,节省存储空间,同时多个应用程序可以共享同一份Qt库,节省系统资源。然而,动态编译需要保证用户的系统中已经安装了相应版本的Qt库,否则会导致程序无法运行。 根据实际需求,我们可以选择静态编译或者动态编译。如果应用程序需要在不同的系统上运行,或者需要独立性较强、便于部署和维护,可以选择静态编译。如果应用程序需要节省存储空间,可以选择动态编译。需要注意的是,在选择编译方式时,应该考虑到预算、性能以及用户环境等因素。总的来说,Qt提供了灵活的编译方式,以满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值