mac上用qt调用自己生成的qt动态库,该动态库又依赖第三方库

qt下依赖于第三方库生成的动态库的调用

  • 概述
    • 基于声网的sdk如何在自己的动态库中使用
      • 使用基于第三方库的动态库
          • 下面看pro文件中的设置

概述

初次使用mac上的qtCreator生成动态库,该动态库编写时调用了第三方库,基于生成的该动态库,编写测试程序来使用改动态库。第三方库为声网所提供的sdk,基于声网sdk实现自己的功能,并封装成动态库。

基于声网的sdk如何在自己的动态库中使用

此时针对于声网sdk封装自己的动态库,先从声网下载mac平台下的sdk和windows平台下的sdk,解压后将需要的库文件和头文件存放在项目目录下,可以建立各自的文件夹。下面先对项目目录下的涉及到第三方库文件和头文件的文件夹作以说明。
在这里插入图片描述
上图中lib是Mac下声网的库文件,因为在.framework后缀的文件夹下有的文件夹下含有头文件。
在这里插入图片描述
在这里插入图片描述
上述后缀.framework文件夹下含有头文件。这个文件夹lib下存放的是Mac下声网的库文件和头文件。
sdk目录下存放的从声网下载的Windows系统下所需的头文件,动态库和静态库。有一个不足就是将Mac下声网使用的静态库放在了lib下,图中蓝色选中的便为Mac下声网的静态库文件。
在这里插入图片描述
在这里插入图片描述
下面来看pro文件中的配置。

QT += gui
QT += core quickwidgetsTEMPLATE = lib
DEFINES += TESTAGORAVIDEODLL_LIBRARYCONFIG += c++11include(deployment.pri)# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \agorartcengine.cpp \avideowidget.cpp \dynamiclibentry.cpp \mainwindow.cpp \testagoravideodll.cpp \video_render_impl.cpp \video_render_opengl.cppHEADERS += \agorartcengine.h \avideowidget.h \dynamiclibentry.h \mainwindow.h \testAgoraVideoDll_global.h \testagoravideodll.h \video_render_impl.h \video_render_opengl.h# Default rules for deployment.
#unix {
#    target.path = /usr/lib
#}
#!isEmpty(target.path): INSTALLS += targetRESOURCES += \qml.qrcDESTDIR += $$PWD\generateDll #生成的动态库存放的路径,该文件夹generateDll会自动创建win32: { #Windows下使用第三方库时的配置(头文件,库文件路径)INCLUDEPATH += $$PWD/sdk/includeLIBS += -L$$PWD/sdk/lib/ -lagora_rtc_sdkCONFIG(Debug, Debug|Release){QMAKE_POST_LINK += copy sdk\dll\*.dll debug #编译后执行内容  将sdk拷贝到debug目录下} else {QMAKE_POST_LINK += copy sdk\dll\*.dll release #将sdk拷贝到release目录下
#        QMAKE_POST_LINK  += && windeployqt Release\AgoraVideoCall.exe #打包程序}
}macx:{ #mac下使用第三方库所需要的配置(头文件,库文件的路径,Mac的系统版本等) 
QMAKE_INFO_PLIST = Info.plist #貌似关于Mac的一些配置,不是自己编写的,别人拷给我的
QMAKE_MACOSX_DEPLOYMENT_TARGET = 12.0 #设置所需平台INCLUDEPATH += $$PWD/lib/AgoraRtcKit.framework/Headers #Mac下使用声网sdk所需头文件的路径QMAKE_LFLAGS += -F/System/Library/Frameworks  #设置可执行程序库文件的查找路径,可能不需要这个设置
QMAKE_LFLAGS += -F$$PWD/lib/ #库文件存放的路径LIBS += -framework AgoraRtcKit #需要使用的库文件
LIBS += -framework Foundation \  #貌似这个库是Mac自己的库,具体不清楚-framework CoreAudio \-framework CoreVideo \-framework CoreServices \-framework AppKit \-framework AudioToolbox \-framework VideoToolbox \-framework Accelerate \-framework SystemConfiguration \-framework AVFoundation \-framework CoreMedia \-framework CoreWLAN \-framework QTKit \-framework CoreGraphicsLIBS += -lresolv
}

以上是pro工程文件中关于在自己的动态库中使用第三方库的配置。另外在运行时出现如下错误:
在这里插入图片描述
需要在自己项目的运行环境下配置参数:
在这里插入图片描述
此参数配置的时候结合生成的错误提示,看看找不到那个库,将该库所在的路径,添加到上图所示参数的路径下。

使用基于第三方库的动态库

  1. 创建自己使用动态库的项目;
  2. 将所需的动态库放在项目目录下;
  3. 将动态库所需的头文件放在项目目录下。
    只需将之前生成的动态库的库文件放在一个单独的目录下,将生成动态库的头文件放在单独的目录下,将存放动态库与头文件的目录放在项目目录下便可。如下:
    在这里插入图片描述
    上图中红色的框中是要使用的动态库所在的文件夹dllLibary和头文件所在的文件夹include,蓝色的框中是当时生成动态库所依赖的第三方库。
下面看pro文件中的设置
QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \dialog.cppHEADERS += \dialog.hFORMS += \dialog.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetmacx:{
QMAKE_INFO_PLIST = Info.plistQMAKE_MACOSX_DEPLOYMENT_TARGET = 12.0 #设置所需平台INCLUDEPATH += $$PWD/includeQMAKE_LFLAGS += -F/System/Library/Frameworks  #设置可执行程序库文件的查找路径
QMAKE_LFLAGS += -F$$PWD/dllLibary #生成的动态库所引用的路径LIBS += -L$$PWD/dllLibary/ -ltestAgoraVideoDll.1.0.0 #使用的动态库
}

还需要配置改使用动态库的测试程序运行环境,和上面提到的一样,选中改项目,右键设置为活动项目,点击左侧的项目,
在这里插入图片描述
在这里插入图片描述
选中运行,即run,在环境这里添加变量,即被测试的动态库当时使用的第三方库的路径,在我的项目文件夹下是lib文件夹,改文件夹存放生成的动态库所依赖的第三方库,将第三方库的路径添加到变量DYLD_FRAMEWORK_PATH 中。接下来就是在需要使用动态库的文件中引入相应的头文件,调用所需函数即可。
注意
当生成动态库有用到一些资源文件时,不需要在使用动态库的项目中考虑该因素,这里的资源文件包含图片,qml文件。使用动态库只需引入要使用的动态库的头文件和库文件,至于动态库所依赖的第三方库文件,直接在测试动态库的项目目录下存放,配置好运行时的环境变量就行,pro文件中只是对当前动态库的库文件和头文件路径的说明。

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

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

相关文章

版本回退

现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: i am gblfy i am yuxin然后,【工作区】-【暂存区】-【本地仓库】尝试提交: 修改…

Docker精华问答 | 数据库为什么不适合放在 Docker 中运行?

戳蓝字“CSDN云计算”关注我们哦!Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。今天就让我们一起看看关于Docker …

Mac下使用macdeployqt打包qt程序:

概述 初次在Mac上使用qt的macdeployqt来打包生成的可执行程序,这里记录下。由于我的程序是调用之前生成的qt动态库,而动态库又依赖于第三方库,相对于没有库文件依赖的程序,这里有一些需要注意的点,下面是打包的步骤。…

路透社:谷歌已停止与华为部分合作;联想否认断供华为PC;微软计划直供Linux内核;谷歌无人机快递Wing进军芬兰……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 阿里巴巴联合欧莱雅发布移动…

管理修改

现在,假定你已经完全掌握了暂存区的概念。下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。 你会问,什么是修改? 比如你新增了一行&#x…

npm install安装依赖报错——常见报错解决方案

小伙伴在开发前端项目过程中,执行npm install安装项目依赖时,往往会遇到各种各样的报错,接下来建仔给大家总结一下几种常见报错解决方案! 第一种报错:无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 报错详…

AWS CEO Andy Jassy 专访:我们一直思考的是未来 2-5 年的事 | 人物志

戳蓝字“CSDN云计算”关注我们哦!人物志:观云、盘点、对话英雄。以云计算风云人物为核心,聚焦个人成长、技术创新、产业发展,还原真实与鲜活!本文来源:Siliconangle《Exclusive interview: How CEO Andy Ja…

撤销修改

自然,你是不会犯错的。不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: Im writing a report.在你准备提交前,一杯咖啡起了作用,你猛然发现了stupid boss可能会让你丢掉这个月的奖金…

QtCreator下使用c++标准输入cin输出cout没有阻塞等待输入

引言 在QtCreator中编写c程序,其中需要从控制台输入,就用了c的cout和cin,本应该等待控制台输入文本,但是却没有。下面是具体的案例。 案例 本文基于QtCreator创建的qt控制台输出程序,创建时选择如下图所示的选项&am…

Docker 系列学习文章 | 什么是容器云?

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者:宝哥devops运维转自:云加社区腾小云导读:容器…

删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交: echo "test del file" >> test.txt git add test.txt git commit -m "add del test.txt"一般情况下,…

mvc设计模式的简单领悟

引言 mvc设计模式,是将数据模型与视图分离,通过控制器来建立起数据模型与视图之间的联系,当数据模型变化自动更新视图。其中M-数据模型,V-视图,C-控制器。下面是一个简单的对于MVC设计模式的使用。 示例 开发环境是…

添加远程库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得…

微服务精华问答 | 什么是金丝雀释放?

戳蓝字“CSDN云计算”关注我们哦!微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。今天,就让我们来看看关于微服务更加有深度的问题吧。1Q:什么是金丝雀释放?A:Canary Rele…

Git 远程配置

Git 配置篇02_远程配置 git 远程配置 2种方案 码云 Github 案例演示 码云 Github更改用户名和邮箱即可 任选1种 第1步:生成SSH key 输入下边命令一直回车(4次回车) ## 码云配置方案: ssh-keygen -t rsa -C "13396492261163…

虚拟器件—虚拟化技术的新利刃 | 时光机

戳蓝字“CSDN云计算”关注我们哦!时光机:搭载这部时光机,带您回顾《程序员》大量优秀文章,重温经典技术干货,我们发现硬核技术永不过时,对于get要点、solve难题、提高自我,仍有非凡意义。作者&a…

git从远程库克隆

首先,登陆GitHub,找到我们的learngit项目 第一种方式(老手建议):通过命令将远程仓库的代码,拉取到本地,文件夹形式。 第二种方式(入门建议):将远程的项目代码下载到本地,压缩包形式。 复制…

图解分布式架构的发展和演进 | 技术干货

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!编注: 架构决定的系统的稳定性,扩展性和并发性,架构的演进是从…

C++中链表反转2

引言 周期按我也写过类似链表反转的文章,这个链表反转是在第二次写的时候写的,由于都是靠当时的思路,两个在代码实现上有所差异,仅以记录。 示例 编程环境 在vs2010下编写的C控制台输出程序,文件名由main.cpp改为t…

阿里云PolarDB重大更新:两大技术突破,传统数据库一键迁移上云

5月21日,阿里云PolarDB发布重大更新,提供传统数据库一键迁移上云能力,可以帮助企业将线下的MySQL、PostgreSQL和Oracle等数据库轻松上云,最快数小时内迁移完成。据估算,云上成本不到传统数据库的1/6。目前,…