编译适用于Symbian的跨平台Qt应用程序

4
我正在开发一个Symbian的Qt应用程序。我必须使用某些特定于平台的API,这些API仅在某些S60版本上可用。例如:
-S60第3版FP1库:S60_common_lib,S60_3rd_ed_lib
-S60第3版FP2库:S60_common_lib,S60_3rd_ed_lib,Symbian_common_lib
-S60第5版库:S60_common_lib,S60_5th_ed_lib,Symbian_common_lib
-Symbian^3库:S60_5th_ed_lib,Symbian3_lib,Symbian_common_lib
正如您所看到的,某些库在多个平台之间共享。目前,我必须多次编译整个项目,以便为所有不同的S60平台获取单独的.exe、资源等文件。我通过在pro文件中为每个平台定义标识符来完成这个过程。例如:
# symbian 3
DEFINES += symbian_3_build
symbian:LIBS += # ...
# S60 3.1
# DEFINES += s60_fp1
# LIBS...

实际代码中我有以下内容:

#ifdef symbian_3_build
    #include <some_s3_header.h>
#elseif s60_fp1
    #include <some_fp1_header.h>
#endif

我的问题如下:
  1. 这是编译适用于Symbian的多平台Qt应用程序的唯一方法吗?(例如,是否有任何办法只使用一个exe就能使其工作)?

  2. 我正在使用Qt Creator。在为一个平台编译后,我将资源文件(.exe、.rsc、_reg.rsc)从epoc文件夹复制到下一个平台编译之前(重新构建会覆盖旧文件)。在收集所有版本并放置到特定位置之后,我将创建一个单独的sis文件,根据平台安装不同的版本。这个过程非常容易出错。有没有更好的方法来做这件事呢?

谢谢。
1个回答

3
这是编译跨平台Qt Symbian应用程序的唯一方法吗?(例如,是否有任何方法可以只使用一个exe使其工作)这真的取决于您配置的最大公共因数。至少你不需要为每个配置修改.pro文件。只需在qmake命令行上提供额外的CONFIG值,例如qmake CONFIG+=symbian3,然后在.pro文件中为symbian3特定部分添加symbian3 {...}块。如果您想要一个单一的二进制文件,并且差异在二进制兼容性级别上,则可以将这些函数调用分离到自己的适配器组件中,该组件使用本地的RLibrary :: Load(),RLibrary :: Lookup()等动态加载所需库,基于底层平台版本。获取运行时平台版本的一种方法是QSysInfo :: s60Version()。

谢谢回复。我一直在研究RLibrary,它似乎对我的DLL非常有用。然而,我使用的API可能是特定于平台的私有API。在这种情况下,我无法确定DLL的结构或访问.def文件。 - Routa
@Routa:你可以将那些DLL文件包装在自己的包装器DLL文件中(静态链接到那些私有API DLL文件),然后动态加载包装器DLL文件。 - laalto
那么基本上这意味着我需要为每个平台创建自己的包装器DLL,然后安装它们。使用Qt是否可以创建这些多态DLL(我的自定义包装器)(我知道如何制作“普通”DLL)? - Routa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接