2010-11-24 47 views
4

我正在为Symbian应用程序开发Qt。我必须使用某些平台特定的API,这些API仅在某些S60版本上可用。例如:为Symbian编译多平台Qt应用程序

-S60第三版FP1库: S60_common_lib,S60_3rd_ed_lib

-S60第三版FP2库: S60_common_lib,S60_3rd_ed_lib,Symbian_common_lib

-S60第五版库: S60_common_lib ,S60_5th_ed_lib,Symbian_common_lib

-Symbian^3 libs: S60_5th_ed_lib,Symbian3_lib,Sy mbian_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. 这是编译多平台的Qt适用于Symbian应用程序的唯一途径(例如有什么办法让它只用一个exe工作)?

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

谢谢。

回答

3

这是为Symbian应用程序编译多平台Qt的唯一方法吗(例如,是否有任何方法让它只用一个exe工作)?

这真的取决于你的配置最大的共同点是什么。

至少您不必修改每个配置的.pro文件。只需在qmake命令行上提供额外的CONFIG值,例如qmake CONFIG+=symbian3,然后在.pro文件中为symbian3特定的零件提供symbian3 { ... }块。

如果你想要一个单一的二进制文件,它们的区别在于二进制兼容性级别,例如,您链接到某些目标上不存在的DLL中的函数,可以将这些函数调用分离到您自己的适配器组件,该组件根据基础平台版本,使用本机RLibrary::Load(),RLibrary::Lookup()等动态加载所需的库。在运行时获取平台版本的一种方式是QSysInfo::s60Version()

+0

感谢您的回复。我一直在看RLibrary,它似乎对我自己的DLL很有用。但是,我正在使用的API可以是一个特定于平台的私有API。在这种情况下,我无法确定DLL的结构或对.def文件有任何访问权限。 – Routa 2010-11-25 07:09:45