本文档介绍动态库开发与使用的相关内容,以指导开发人员进行动态库开发及使用。
适用于SyberOS2.0版本。
Platform SDK
,是一个运行在开发机上的Chroot环境,SyberOS的开发任务基本上都是在这个Chroot环境中进行。参考文档:SyberOS PDK介绍下面以一个简单示例来讲解如何开发动态库。
1.首先,创建一个目录(假设名称为testLib
)用来存放动态库的源代码文件;
mkdir testLib
2.切换到testLib
目录下,创建库的源代码文件;
这个动态库比较简单,只有一个LibInterface.h
与LibInterface.cpp
文件。
LibInterface.h
文件内容如下所示:
#ifndef LIBINTERFACE_H
#define LIBINTERFACE_H
#include <QObject>
class LibInterface: public QObject
{
Q_OBJECT
public:
LibInterface(QObject* parent = 0);
virtual ~LibInterface();
int add(int a, int b);
};
#endif
LibInterface.cpp
文件内容如下所示:
#include "LibInterface.h"
#include <QDebug>
LibInterface::LibInterface(QObject* parent)
:QObject(parent)
{
qDebug() << "LibInterface constructor";
}
LibInterface::~LibInterface()
{
qDebug() << "LibInterface destructor";
}
int LibInterface::add(int a, int b)
{
qDebug() << "LibInterface::add():return " << a+b;
return a + b;
}
pdk
命令进入PDK
编译环境(sb2
命令必须在PDK编译环境
执行)testLib
下,执行下面命令生成工程文件
(.pro
)pdk
sb2 -t target-armv7tnhl-xuanwu qmake -project
执行后,执行ls
可以看见testLib
目录下增加了一个名为testLib.pro
的工程配置文件
######################################################################
# Automatically generated by qmake (3.0) Thu Dec 12 07:27:19 2019
######################################################################
TEMPLATE = lib // 这里需要修改成lib
TARGET = testLib
INCLUDEPATH += .
CONFIG += plugin // 需要新增这行配置项
# Input
HEADERS += LibInterface.h
SOURCES += LibInterface.cpp
sb2 -t target-armv7tnhl-xuanwu qmake //生成Makefile文件
sb2 -t target-armv7tnhl-xuanwu make //编译
上面两个命令成功执行后,执行 ls 命令可以看到在testLib目录下生成了动态库libtestLib.so
。
注:可执行以下命令删除编译产生的中间文件
sb2 -t target-armv7tnhl-xuanwu make distclean
按照上面的步骤操作后,一个简单的动态库libtestLib.so
就准备好了,在下面的介绍中我们就可以使用这个动态库了。
下面创建了一个简单的SyberOS应用程序,该程序中使用了上面的动态库:定义了动态库中的LibInterface
类的实例并调用LibInterface
类提供的add
方法。
创建工程名称为callTestLib
的SyberOS应用程序(请参考第一个SyberOS应用)。
在callTestLib的工程目录下创建一个存放动态库的目录,假设创建的目录名为libs
;
将上面编译出的动态库libtestLib.so
拷贝到2中的libs
目录下;
将动态库testLib
目录下的头文件LibInterface.h
拷贝到工程目录下的src
目录下;
修改callTestLib
工程的pro文件,添加编译和运行工程时需要的动态库路径信息,pro文件中需要添加的信息如下所示:
LIBS += -L$$PWD/libs -ltestLib
# $$INSTALL_DIR/libs, 固定写法, 不可修改
QMAKE_LFLAGS += -Wl,-rpath=$$INSTALL_DIR/libs
libFile.files=$$PWD/libs/*
# $$INSTALL_DIR/libs, 动态库安装目录, 固定写法, 不可修改
libFile.path=$$INSTALL_DIR/libs
INSTALLS += libFile
callTestLib
工程的CallTestLib_Workspace.cpp
文件中使用动态库,CallTestLib_Workspace.cpp
文件内容如下所示:#include "CallTestLib_Workspace.h"
#include <QDebug>
#include "LibInterface.h" // 包含动态库提供的头文件
CallTestLib_Workspace::CallTestLib_Workspace()
: CWorkspace()
{
m_view = SYBEROS::SyberosGuiCache::qQuickView();
QObject::connect(m_view->engine(), SIGNAL(quit()), qApp, SLOT(quit()));
m_view->setSource(QUrl("qrc:/qml/main.qml"));
m_view->showFullScreen();
LibInterface *libObject = new LibInterface; // 创建动态库对象
int sum = libObject->add(10, 10); // 调用对象接口
qDebug() << "CallTestLib_Workspace::CallTestLib_Workspace():sum=" << sum;
}
void CallTestLib_Workspace::onLaunchComplete(Option option,
const QStringList& params)
{
Q_UNUSED(params)
switch (option) {
case CWorkspace::HOME:
qDebug()<< "Start by Home";
break;
case CWorkspace::URL:
break;
case CWorkspace::EVENT:
break;
case CWorkspace::DOCUMENT:
break;
default:
break;
}
}
需要在真机上构建运行我们的callTestLib
工程。(手机运行callTestLib
工程时请替换调试证书,否则会提示验证失败)
运行我们的callTestLib
工程,SyberOS IDE的“应用程序输出框”中的输出信息如下所示:
[CallTestLib]:CDeclarativeScreen::setAllowedOrientations called with: QFlags(0x1)
[CallTestLib]:LibInterface constructor
[CallTestLib]:LibInterface::add(): return 20 //动态库输出信息
[CallTestLib]:CallTestLib_Workspace::CallTestLib_Workspace(): sum------ 20 //CallTestLib工程输出信息
[CallTestLib]:SyberosServiceCachePrivate::qApplication argc: 1
[CallTestLib]:SyberosServiceCachePrivate::qApplication argc:动态库开发与使用使用动态库
见IDE示例