如何在基于 BB10 Cocos2D 的应用程序中导入和使用 QObject

Posted

技术标签:

【中文标题】如何在基于 BB10 Cocos2D 的应用程序中导入和使用 QObject【英文标题】:How to import and use QObject in a BB10 Cocos2D based app 【发布时间】:2013-07-26 10:08:09 【问题描述】:

我目前正在使用 Cocos2dx 提供的 BBTemplateProject 示例为 BB10 平台构建 Cocos2d-x 游戏。我是 C++ 编程的新手,目前的游戏是我已经工作了一段时间的 java 项目的一个端口。为了保存游戏数据(分数、一些设置等),我打算使用 BB10 提供的 QtSQl 库。 我已经在示例 Cascades 应用程序中成功运行了一些示例 Qtsql 代码,并且运行良好。 但是,将相同的代码集成到我的 Cocos2dx BB10 项目中是行不通的。 我使用momentics IDE并已将qt4、QtCore、QtDeclarative、路径/符号添加到项目中,但仍然收到以下错误

undefined reference to `QObject::QObject(QObject*)'
undefined reference to `vtable 
undefined reference to `QSqlDatabase::defaultConnection'
.. and a bunch of other Q- related object errors.

在这里阅读 Qobject http://developer.blackberry.com/cascades/reference/moc.html 我怀疑 MOC 编译器没有引用引用或类似问题。此外,鉴于相同的代码在 Momentics IDE 中集成到自动生成的级联项目中时运行良好,我被认为是某种 moc 编译器问题。鉴于我是 C++ 开发的新手,我仍然无法弄清楚如何将适当的 qmake 文件规则添加到 Momentics IDE 以识别 Qobjects。这方面需要帮助。

肯定会感谢经验丰富的 c++ 开发人员提供的有关如何解决此问题的任何指示,或者在 cocos2dx blackberry 10 项目中存储数据的更好方法。

提前致谢。

编辑:

这是我迄今为止在尝试使用 QtSql 进行数据库交互方面的进展。 QtSQl 需要 QtCore,其中包含上面的 QObject。到目前为止,我一直无法成功集成 QtCore 库。

我做了以下事情。

使用以下过程将 /usr/include/qt4 和 /usr/include/QtCore 和 /usr/include/QtSql 添加到我的包含列表中

在项目资源管理器中右键单击您的项目并选择属性

将树扩展为 C/C++ 常规/路径和符号 将路径和符号框架中的配置更改为[所有配置] 单击“包含”标签并在“语言”列表中选择 GNU C(或对每种语言都执行此操作)。 单击添加...并键入 $QNX_TARGET/usr/include/qt4 并按确定

单击添加...并键入 $QNX_TARGET/usr/include/qt4/QtCore 并按确定

使用 Momentics IDE 添加库函数将 QtCore 和 QtSql 添加到项目中。右键单击->配置->添加库和标准 BlackBerry 平台库。库添加成功。

我基本上遵循了这篇相关帖子Adding QtCore Library in blackberry 10 sdk 中详述的步骤。但是现在得到这个错误。

\win32\x86\usr\bin\ntoarm-ld: cannot find -lQtCore

该帖子中的 OP 提到解决“一些链接器问题”,但没有提及如何解决。我还尝试修改 bar-descriptor.xml 文件添加以下行

  <env var="LD_LIBRARY_PATH" value="app/native/lib:/usr/lib/qt4/lib"/>
<asset path="$QNX_TARGET\$CPUVARDIRusr\lib\qt4\lib\libQtCore.so" type="Qnx/Elf">lib/libQtCore.so.4</asset>

错误仍然存​​在。 如何解决此“链接器”或 library-no-found 错误?非常感谢。

【问题讨论】:

【参考方案1】:

首先,如果您打算在 BlackBerry 10 和 android 上使用相同的应用程序,因为您来自 Java,我会尝试使用比 Qt 更小的东西,例如 SQLite library,以保持它两个平台之间的移植尽可能简单。但是您显然可以在 BB10 上使用 QtSQL 并在 Android 中使用其他东西,您只需编写更多代码。

其次,关于您的问题:对QObject::QObject(QObject*) 的未定义引用意味着您正在使用这个符号(QObject 构造函数,您可能正在调用它,因为你们中的一个类继承自QObject),但什么都不是提供它。您可能已将 QtCore 添加到您的包含路径中,因为编译器发现它,但不是链接器:您需要指定您希望您的应用程序与 QtCore.so 链接(或者可能是 QtCore4.so,我没有 SDK现在检查确切的名称)。您将找到有关如何执行此操作所需的一切here。

关于 moc:moc 代表 Meta Object Compiler。它基本上解析你的标题,在你的类中寻找元数据:主要是属性、信号和插槽。更具体地说,所有需要 Q_OBJECT 宏的东西。如果您不使用这些功能,则无需运行 moc。

如果你必须运行它(因为你使用了一些元对象功能):你有两个选择。选项一:使用 QMake 编译您的项目。您必须从头开始将您的项目重新创建为 Qt 项目(可能与 Momentics 上的 Cascades 项目没有区别,但这只是删除您链接到的库的问题,没什么大不了的)才能做到这一点。选项二:添加自定义规则以在需要它的标头上运行 moc。它将生成一些 moc_yourclass.cpp 文件,您需要将这些文件包含在您的项目中。我不知道如何在 Momentics 上添加自定义步骤,但我认为它应该是可行的……

【讨论】:

您好 Kernald,感谢您的详细回复,我一定会查看您提供的链接到 QtCore.so 等的链接。希望它解决了我未定义的参考问题。但是,您提出了一个重要的选择,我想加倍努力-使用 SQLite 库。如何在 bb10 上使用 SQLite 库?我之前假设在 BB10 上使用 sqlite 的唯一方法是使用 QtSQL。这 ? developer.blackberry.com/cascades/reference/… ? P.S 我没有在 Android 和 BB10 上使用相同的应用程序。 Android 版本是用 cocos2d for android 编写的,java 端口。 好吧,我在想这个:sqlite.org/capi3ref.html 这是“官方”SQLite 库(我还在答案中添加了链接以避免混淆)。其他的主要是围绕它的包装器,或者用更完整的 API/抽象重新编码相同的功能。它具有完全跨平台的优势。但是,如果您打算仅在 BB10 上使用此代码,我认为 SqlDataAccess 或 QtSql 会是更好的选择。至少,更容易使用。我不知道 SqlDataAccess。我猜你可以将它与 QtSql 进行比较并选择你喜欢的。 您的链接听起来是个不错的选择。但是,我想将它集成到 BB10 可能是另一场拉锯战。从 Iv 看到的示例中,使用 SqlDataAcess 与 QtSql 结合使用,而不是独立工作 (developer.blackberry.com/cascades/reference/…)。总而言之,有几个有价值的 Q 函数(例如 QString)伴随着成功导入/集成 QtCore/Qtsql 库,激发了选择 QtSql 的选择。 只针对 BB10,QtSql 和/或SqlDataAccess 可能是要走的路。但是,作为参考:SQLite 库只是一个 C 文件,没有任何依赖关系。包含在项目中非常简单;-)

以上是关于如何在基于 BB10 Cocos2D 的应用程序中导入和使用 QObject的主要内容,如果未能解决你的问题,请参考以下文章

在 cocos2d 中访问图片库

在 BB10 应用程序开发的 cpp 文件中包含 <QtNetwork> 时出错

单面平台(Box2D/Cocos2D)

如何连接 FaceBook SDK 和 cocos2d

如何在 Cocos2d 中播放音频文件的特定部分

cocos2d如何使加载图像持续更长时间?