qt下依赖于第三方库生成的动态库的调用
概述
初次使用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 quickwidgets
TEMPLATE = lib
DEFINES += TESTAGORAVIDEODLL_LIBRARY
CONFIG += c++11
include(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.0
SOURCES += \
agorartcengine.cpp \
avideowidget.cpp \
dynamiclibentry.cpp \
mainwindow.cpp \
testagoravideodll.cpp \
video_render_impl.cpp \
video_render_opengl.cpp
HEADERS += \
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 += target
RESOURCES += \
qml.qrc
DESTDIR += $$PWD\generateDll #生成的动态库存放的路径,该文件夹generateDll会自动创建
win32: { #Windows下使用第三方库时的配置(头文件,库文件路径)
INCLUDEPATH += $$PWD/sdk/include
LIBS += -L$$PWD/sdk/lib/ -lagora_rtc_sdk
CONFIG(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 CoreGraphics
LIBS += -lresolv
}
以上是pro工程文件中关于在自己的动态库中使用第三方库的配置。另外在运行时出现如下错误:
需要在自己项目的运行环境下配置参数:
此参数配置的时候结合生成的错误提示,看看找不到那个库,将该库所在的路径,添加到上图所示参数的路径下。
使用基于第三方库的动态库
- 创建自己使用动态库的项目;
- 将所需的动态库放在项目目录下;
- 将动态库所需的头文件放在项目目录下。
只需将之前生成的动态库的库文件放在一个单独的目录下,将生成动态库的头文件放在单独的目录下,将存放动态库与头文件的目录放在项目目录下便可。如下:
上图中红色的框中是要使用的动态库所在的文件夹dllLibary和头文件所在的文件夹include,蓝色的框中是当时生成动态库所依赖的第三方库。
下面看pro文件中的设置
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += 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.0
SOURCES += \
main.cpp \
dialog.cpp
HEADERS += \
dialog.h
FORMS += \
dialog.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
macx:{
QMAKE_INFO_PLIST = Info.plist
QMAKE_MACOSX_DEPLOYMENT_TARGET = 12.0 #设置所需平台
INCLUDEPATH += $$PWD/include
QMAKE_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文件中只是对当前动态库的库文件和头文件路径的说明。