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

news2024/11/28 20:34:09

最近需要在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1599197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【静态分析】软件分析课程实验A1-活跃变量分析和迭代求解器

1 作业导览 为 Java 实现一个活跃变量分析&#xff08;Live Variable Analysis&#xff09;。实现一个通用的迭代求解器&#xff08;Iterative Solver&#xff09;&#xff0c;用于求解数据流分析问题&#xff0c;也就是本次作业中的活跃变量分析。 Live Variable Analysis 详…

Midjourney常见玩法及prompt关键词技巧

今天系统给大家讲讲Midjourney的常见玩法和prompt关键词的一些注意事项&#xff0c;带大家入门&#xff5e;&#xff08;多图预警&#xff0c;建议收藏&#xff5e;&#xff09; 一、入门及常见玩法 1、注册并添加服务器&#xff08;会的童鞋可跳过&#xff5e;&#xff09; …

Jmeter分布式压测操作流程

分布式压测原理 分布式压测操作 保证本机和执行机的JDK和Jmeter版本一致配置Jmeter环境变量配置Jmeter配置文件 上传每个执行机服务jmeter chmod -R 755 apache-jmeter-5.1.1/ 执行机配置写自己的ip 控制机配置所有执行机ip,把server.rmi.ssl.disable改成true 将本机也作为压…

骨传导耳机哪个品牌最好?六大压箱底干货,一看便知!

在当今的蓝牙耳机市场&#xff0c;骨传导耳机以其独特的佩戴方式逐渐晋升为耳机界的新宠。然而&#xff0c;随着骨传导耳机逐渐成为热门款式&#xff0c;市场上的骨传导耳机品牌琳琅满目&#xff0c;消费者在选购时往往感到无从下手。其中&#xff0c;还经常有人入手耳机后出现…

【知识】Latex中的em/pt/mm等长度单位及使用场景

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 目录 一、Latex中的em pt mm等度量单位说是什么意思&#xff1f;还有哪些&#xff1f; 二、在使用的时候应该如何选择&#xff1f;他们分别适用于那些场景&#xff1f; 三、有哪些使用示例&#xff1f; 1. 设…

文献学习-37-动态场景中任意形状针的单目 3D 位姿估计:一种高效的视觉学习和几何建模方法

On the Monocular 3D Pose Estimation for Arbitrary Shaped Needle in Dynamic Scenes: An Efficient Visual Learning and Geometry Modeling Approach Authors: Bin Li,† , Student Member, IEEE, Bo Lu,† , Member, IEEE, Hongbin Lin, Yaxiang Wang, Fangxun Zhong, Me…

刷代码随想录有感(33):滑动窗口滑行途中框内最大值

又是需要死记硬背理解的题目。 题干如下: 代码&#xff1a; class Solution { private:class MyQueue{deque<int> que;public:void pop(int value){if(!que.empty() && value que.front()){que.pop_front();}}void push(int value){while(!que.empty() &&…

「51媒体」媒体邀约采访的分类?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约采访可以根据不同的标准进行分类。以下是一些常见的分类方式&#xff1a; 1. 按照邀约形式&#xff1a; - 电话邀约&#xff1a;通过电话与媒体联系&#xff0c;说明采访或报道…

地质灾害监测预警系统:科技守护,构筑智能预警屏障

随着全球气候变化和人为活动的加剧&#xff0c;地质灾害频繁发生&#xff0c;给人们的生命财产安全带来了严重威胁。为了降低地质灾害带来的损失&#xff0c;地质灾害监测预警系统应运而生。本文将为您详细介绍地质灾害监测预警系统的原理、功能以及在实际应用中的效果。 一、地…

AI-数学-高中-37频率与概率、概率基础知识综合示例

原作者视频&#xff1a;【概率】【一数辞典】6频率与概率_哔哩哔哩_bilibili 当直接求概率不好求时&#xff0c;通过大量的实验的频率来估算概率。 在频数越大的情况下&#xff0c;波动越来越小&#xff0c;频率越稳定&#xff0c;去向一个稳定的数值&#xff0c;这个值就是概…

敢教日月换新天!SuperHarness-3D:电控行业生态圈的国产电控仿真利器!

SuperHarness-3D&#xff08;以下简称SH-3D&#xff09;是利驰软件基于三维建模软件SolidWorks平台开发的一款聚焦于电气/自动化一体化设备/柜体的布线设计仿真软件&#xff0c;是利驰首款机电协同设计理念产品。 SH-3D是一款电气端的高效管理&设计工具&#xff0c;在传统…

【LeetCode】 2724. 排序方式

排序方式 给定一个数组 arr 和一个函数 fn&#xff0c;返回一个排序后的数组 sortedArr。你可以假设 fn 只返回数字&#xff0c;并且这些数字决定了 sortedArr 的排序顺序。sortedArr 必须按照 fn 的输出值 升序 排序。 你可以假设对于给定的数组&#xff0c;fn 不会返回重复的…

普通人做抖音小店真的能赚钱吗?可以,但更取决于个人

大家好&#xff0c;我是电商花花。 现在做抖音小店的基本上都是一些新商家&#xff0c;对于我们众多零基础的朋友来说&#xff0c;是期待也是一份挑战。 抖音小店作为一个充满机会的新兴平台&#xff0c;许多人都欣喜的投入其中&#xff0c;期望能够借此来改变自己的命运&…

护眼灯哪个品牌好?五大护眼灯品牌推荐

护眼灯哪个品牌好&#xff1f;在挑选对眼睛有益的台灯时&#xff0c;专业护眼台灯无疑是明智的选择。这类台灯不仅严格按照国家的标准制造&#xff0c;确保了安全与质量的可靠性&#xff0c;除此之外护眼台灯还采用了经过精心设计的发光结构&#xff0c;有效减少了光线对眼睛的…

C++跨平台helloworld【安卓为特例得条件编译】

首先 遇到个问题略跨了我的技术栈盲区 虽然学过点u游戏开发 ue嘛侧重主机端 许是这问题角度略清奇等 总之竟没在csdn搜到 sos so 先问了某cpp技术栈语言能力者朋友 真人解答&#xff1a; 话虽这么说 实际上具体怎么写我还不确定&#x1f62c; 基于科学严谨的态度 于是又…

Linux 添加启动服务--Service

1&#xff0c;服务配置service文件 Service 服务的实际作用是开启后自动启动服务&#xff0c;运行一些不须要登录的程序&#xff0c;任务。 实例1、上电自动连接WIFI热点 1.1 新建.service文件 /etc/systemd/system/wificonnect.service [Unit] DescriptionService [wifico…

记一次Serializable序列化和反序列化导致的线上报错

个人博客地址&#xff1a;https://blog.flycat.tech/archives/1709570797355 背景 某个需求上线后告警群里面收到了报错的消息&#xff0c;报错摘要如下&#xff1a; Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFai…

P9241 [蓝桥杯 2023 省 B] 飞机降落

原题链接&#xff1a;[蓝桥杯 2023 省 B] 飞机降落 - 洛谷 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dfs全排列的变形题。 因为最后问飞机是否降落&#xff0c;并且一架飞机降落完毕时另一架飞机才能降落。所以我们设置dfs的两个变量cnt为安全…

【随笔】Git 高级篇 -- 管理多分支 git rebase(二十二)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址&#xff1a;https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念&#xff1a;FSM&#xff08;有限状态机&#xff09;&#xff0c;模式之间转换 状态机&#xff0c;也叫有限状态机&#xff08…