2010-11-24 8 views
4

Ich entwickle eine Qt für Symbian-Anwendung. Ich muss bestimmte plattformspezifische APIs verwenden, die nur für bestimmte S60-Versionen verfügbar sind. Zum Beispiel:Kompilieren Multi-Plattform Qt-Anwendung für Symbian

-S60 3. Auflage FP1 Libs: S60_common_lib, S60_3rd_ed_lib

-S60 3. Auflage FP2 Libs: S60_common_lib, S60_3rd_ed_lib, Symbian_common_lib

-S60 5. Auflage Libs: S60_common_lib S60_5th_ed_lib, Symbian_common_lib

-Symbian^3 libs: S60_5th_ed_lib, Symbian3_lib, Sy mbian_common_lib

Wie Sie sehen können, werden bestimmte Bibliotheken von mehreren Plattformen gemeinsam genutzt. Derzeit muss ich das ganze Projekt mehrere Male kompilieren, um eine separate .exe, Ressourcen usw. für alle verschiedenen S60-Plattformen zu erhalten. Ich tue dies, indem ich eine Kennung für jede Plattform in der Profildatei definiere. Zum Beispiel:

# symbian 3 
DEFINES += symbian_3_build 
symbian:LIBS += # ... 
# S60 3.1 
# DEFINES += s60_fp1 
# LIBS... 

Und in eigentlichen Code Ich habe so etwas wie:

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

Also meine Fragen sind:

  1. Ist dies der einzige Weg, Multi-Plattform Qt für Symbian Anwendung zu kompilieren (zB gibt es eine Möglichkeit, es mit nur einer exe arbeiten zu lassen)?

  2. Ich benutze Qt Creator. Nach dem Kompilieren für eine Plattform kopiere ich die Ressourcendateien (.exe, .rsc, _reg.rsc) aus dem epoc-Ordner vor dem Kompilieren zur nächsten Plattform (Wiederaufbau überholt alte Dateien). Nachdem alle Versionen kompiliert und an einem bestimmten Ort gesammelt wurden, erstelle ich eine einzelne sis-Datei, die verschiedene Versionen auf der Plattform installiert. Dieser Prozess ist sehr anfällig für Fehler. Gibt es einen besseren Weg, dies zu tun?

Danke.

Antwort

3

Ist dies die einzige Möglichkeit, Multiplattform-Qt für Symbian-Anwendungen zu kompilieren (z. B. gibt es eine Möglichkeit, es mit nur einer exe arbeiten)?

Es hängt wirklich davon ab, was der größte gemeinsame Nenner Ihrer Konfigurationen ist.

Zumindest müssen Sie die .pro-Datei nicht für jede Konfiguration ändern. Geben Sie einfach zusätzliche CONFIG-Werte in der qmake-Befehlszeile ein, z. qmake CONFIG+=symbian3 und dann Blöcke in .pro-Datei für Symbian3-spezifische Teile.

Wenn Sie eine einzelne binäre und möchten, sind die Unterschiede auf Binärkompatibilitätsebene, z. Wenn Sie Verknüpfungen zu Funktionen in DLLs erstellen, die auf einem Ziel nicht vorhanden sind, können Sie diese Funktionsaufrufe an eine eigene Adapterkomponente trennen, die die erforderlichen Bibliotheken dynamisch mit den systemeigenen RLibrary::Load(), RLibrary::Lookup() usw. auf der Basis der zugrunde liegenden Plattformversion lädt. Eine Möglichkeit, die Plattformversion zur Laufzeit zu erhalten, ist QSysInfo::s60Version().

+0

Danke für die Antwort. Ich habe mir RLibrary angeschaut und es scheint mir mit meinen eigenen DLLs nützlich zu sein. Die API, die ich verwende, kann jedoch beispielsweise eine plattformspezifische private API sein. In diesem Fall kann ich mir über die Struktur der DLL nicht sicher sein oder habe keinen Zugriff auf die .def-Datei. – Routa

+0

@Routa: Sie könnten diese DLLs in Ihre eigenen Wrapper-DLLs (statisch mit diesen privaten API-DLLs verknüpft) einbinden und dann die Wrapper-DLL dynamisch laden. – laalto

+0

Also im Grunde bedeutet das, dass ich meine eigene Wrapper-DLL für jede Plattform erstellen und dann installieren muss. Ist es möglich, diese polymorphen DLLs (meine eigenen Wrapper) mit Qt zu erstellen (ich weiß, wie man "normale" DLLs erstellt)? – Routa