2010-11-24 69 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