Qt Programme als Universal Binaries erstellen

Natürlich ist es kein Problem auch Qt Programme als UB’s (Universal Binaries) zu erstellen. Allerdings ist es unter Qt 4.x wesentlich einfacher als unter Qt 3.x, weswegen ich die Vorgehensweise kurz getrennt darstelle

UB’s mit Qt 3.3

Rein theoretisch kann man auch hier beide Zielplattformen (ppc und i386) auf einer Maschine erstellen, was aber zusätzlichen Aufwand erfordert. Einfacher ist es binaries für die beiden Plattformen auf einer passenden Maschine zu erstellen und später zusammenzufügen. die 64bit Targets (ppc64 bzw. x86_64) spielen hier übrigens keine Rolle, da Mac OS X 10.4 sowieso keine 64bit GUI Programme unterstützt.

Das Hauptproblem bei Qt 3.3 ist, dass die Qt Library selber nicht als UB vorliegt oder out-of-the-box erstellt wreden kann. Daher muss man auf jeder Zielplattform diese Library erstellen.

Danach erstellt man sein Programm und/oder seine Libraries/Frameworks auf jeder Maschine. Am Schluss legt man auf jeder Maschine ein Build-Verzeichnis i386 und ppc an, kopiert die Binaries rein und führt Sie mit dem lipo Befehl zusammen, bspw:

lipo -create  build/i386/test build/ppc/test -output test.app/Contents/MacOS/test

mit dem file Kommando sieht man, dass das neue test Binary nun 2 Plattformen unterstützt:

file  test.app/Contents/MacOS/test

test.app/Contents/MacOS/test: Mach-O universal binary with 2 architectures

test.app/Contents/MacOS/test (for architecture i386): Mach-O executable i386
test.app/Contents/MacOS/test (for architecture ppc): Mach-O executable ppc

UB’s mit Qt 4.x

Hier ist das Sache wesentlich einfacher. Wenn man das Toolkit mit dem -universal Flag übersetzt hat man ein UB fähiges Qt Framework. In seinem .pro File muss man dann nur noch

QMAKE_MAC_SDK=/path/to/MacOSX10.4u.sdk
CONFIG+=x86 ppc

angeben um ein fertiges Binary zu erzeugen. Im Hintergrund schleusst Qt einfach die -arch Flags an den g++ Compiler weiter.

weitere Hinweise:

gfortran unterstützt in der eigentlichen Fassung diese -arch Flags noch nicht. Hier gibt es allerdings einen weiteren experimentellen Fork der das schon kann:

http://r.research.att.com/tools/

Um die Qt Bibliothek mit dem eigenen Programm auszuliefern muss der install_name (Linux: soname) geändert werden, dies ist hier am Bsp. von Qt 3.3 dargestellt:

..für die Qt Library selber

 install_name_tool id @executable_path/../Frameworks/libqt.3.dylib 
demo.app/Contents/Frameworks/libqt.3.dylib

und für das Programm:

install_name_tool -change libqt.3.dylib 
@executable_path/../Frameworks/libqt.3.dylib 
test.app/Contents/MacOS/test

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.