2014-11-07 6 views
5

Ich habe letzte libgcrypt & Libgpg-Fehler-Bibliotheken von https://www.gnupg.org/download/index.html heruntergeladen. Ich habe erfolgreich (beide Bibliotheken) mit ./configure --enable-static --disable-shared; machen ; make install auf meinem Mac (Mavericks w/OSX 10.10 & neuesten Xcode 6.1).Cross kompilieren libgcrypt statische lib für die Verwendung auf iOS

Ich kann gut mit diesen neuen Bibliotheken von einer OS X-Client-App verknüpfen, die ich erstelle. So weit, ist es gut. Einfach perfekt. ABER, ich muss auch einen iOS-Client mit dem gleichen genauen Quellcode erstellen.

Fragen:

1) Was die Änderungen an die Befehlszeile Build-Sequenz für die Bibliothek, die ich brauchen würde, eine universelle statische Bibliothek für den (Simulator, Mac & iOS) zu bauen? 2) Oder muss ich separate statische Bibliotheken für iOS erstellen? Und wenn ja, welche Kommandozeilen-Magie müsste ich erreichen, um die Zielarchitektur richtig zu machen?

Antwort

12

Beachten Sie, dass es nicht möglich ist, eine universelle Bibliothek zu erstellen, die sowohl für iOS Simulator als auch für Mac OS funktioniert. iOS/Intel und macOS/Intel sind nicht über die C-Laufzeitbibliothek (Libc) ABI-kompatibel. Diese Antwort dient dazu, Ihnen zu zeigen, wie Sie autoconf-basierte Projekte für iOS-Ziele kompilieren können, und Sie können die resultierenden statischen Archive einfach zusammen kopieren.

Sie wollen, so etwas tun:

#!/bin/bash -e -x 

OPT_FLAGS="-Os -g3" 
MAKE_JOBS=16 

dobuild() { 
    export CC="$(xcrun -find -sdk ${SDK} cc)" 
    export CXX="$(xcrun -find -sdk ${SDK} cxx)" 
    export CPP="$(xcrun -find -sdk ${SDK} cpp)" 
    export CFLAGS="${HOST_FLAGS} ${OPT_FLAGS}" 
    export CXXFLAGS="${HOST_FLAGS} ${OPT_FLAGS}" 
    export LDFLAGS="${HOST_FLAGS}" 

    ./configure --host=${CHOST} --prefix=${PREFIX} --enable-static --disable-shared 

    make clean 
    make -j${MAKE_JOBS} 
    make install 
} 

SDK="iphoneos" 
ARCH_FLAGS="-arch armv7" 
HOST_FLAGS="${ARCH_FLAGS} -miphoneos-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" 
CHOST="arm-apple-darwin" 
PREFIX="${HOME}/DEVICE_ARM" 
dobuild 

SDK="iphoneos" 
ARCH_FLAGS="-arch arm64" 
HOST_FLAGS="${ARCH_FLAGS} -miphoneos-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" 
CHOST="arm-apple-darwin" 
PREFIX="${HOME}/DEVICE_ARM64" 
dobuild 

SDK="iphonesimulator" 
ARCH_FLAGS="-arch i386" 
HOST_FLAGS="${ARCH_FLAGS} -mios-simulator-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" 
CHOST="i386-apple-darwin" 
PREFIX="${HOME}/SIM_i386" 
dobuild 

SDK="iphonesimulator" 
ARCH_FLAGS="-arch x86_64" 
HOST_FLAGS="${ARCH_FLAGS} -mios-simulator-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" 
CHOST="x86_64-apple-darwin" 
PREFIX="${HOME}/SIM_x86_64" 
dobuild 

Ich warf nur das Skript zusammen und überprüft es funktioniert (mit dem Zusatz von --disable-libpng und das Überspringen Tests) für die pixman. Sie müssen wahrscheinlich für libgcrypt anpassen, aber es dient dazu, das allgemeine Muster zum Erstellen von autoconf/automake/glibtool-basierten Projekten für iOS zu zeigen.

Nach dem Erstellen, haben Sie Inhalt in ~/{DEVICE_ARM {, 64}, SIM_ {i386, x86_64}} und Sie können entweder die statischen Bibliotheken zusammen lipo oder einfach alle in Ihrem Projekt (Linker) verwenden wird Warnungen über fehlende Slices für die "anderen" Archive ausgeben, die Sie ignorieren können.

+0

Können Sie explizit sein, da ich mit der Nuance von Build-Typen nicht vertraut bin. Ich habe bemerkt, dass config.log mehrere #Unterstützte Architektur erzeugt. –

+0

Ok, ich habe die Antwort aktualisiert, um noch expliziter zu sein. Ich habe ein Skript geschrieben und es auf Pixman getestet. Sie müssen es für andere autoconf/automake/glibtool Projekte anpassen, aber Sie erhalten die allgemeine Idee. –

Verwandte Themen