2014-11-07 7 views
5

Ho scaricato le libgcrypt & libgcrypt librerie di errori da https://www.gnupg.org/download/index.html. Ho compilato con successo (riga di comando) entrambe le librerie usando ./configure --enable-static --disable-shared; rendere ; installa sul mio Mac (Mavericks con OSX 10.10 & ultimo Xcode 6.1).cross libile libgcrypt per l'uso su iOS

Posso collegare perfettamente a queste nuove librerie da un'applicazione client OS X che sto creando. Fin qui tutto bene. Semplicemente perfetto. MA, ho anche bisogno di costruire un client iOS usando lo stesso esatto codice sorgente.

Domande:

1) Quali sono le modifiche alla sequenza di generazione riga di comando per la libreria avrei bisogno di costruire una libreria statica universale per la (simulatore, Mac & iOS)? 2) O devo creare librerie statiche separate per iOS? E se sì, ancora, quale magia da riga di comando avrei bisogno per ottenere l'architettura di destinazione giusta?

risposta

12

Si noti che non è possibile creare una libreria universale che funzioni sia per iOS Simulator che per macOS. iOS/Intel e macOS/Intel non sono compatibili ABI sopra la libreria di runtime C (Libc). Questa risposta serve a mostrare come crosscompile i progetti basati su autoconf per i target iOS e puoi facilmente collegare gli archivi statici risultanti.

Hai voglia di fare qualcosa di simile:

#!/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 

ho appena buttato quel copione insieme e verificato che funziona (con l'aggiunta di test --disable-libpng e saltare) per pixman. Probabilmente dovrai personalizzarlo per libgcrypt, ma serve per mostrare il modello generale per la creazione di progetti basati su autoconf/automake/glibtool per iOS.

Dopo la creazione, avrete contenuti in ~/{DEVICE_ARM {, 64}, SIM_ {i386, x86_64}} e potete o lipo le librerie statiche insieme o semplicemente usarle tutte nel progetto (il linker emetterà avvisi sulle fette mancanti per gli "altri" archivi che è possibile ignorare).

lipo -create -output lib.a DEVICE_ARM/lib/lib.a DEVICE_ARM64/lib/lib.a SIM_i386/lib/lib.a SIM_x86_64/lib/lib.a 
+0

Puoi essere esplicito dal momento che sono completamente estraneo alle sfumature dei tipi di configurazione di build. Ho notato che config.log sta producendo più #error Architettura non supportata. –

+0

Ok, ho aggiornato la risposta per essere ancora più esplicita. Ho scritto una sceneggiatura e l'ho provata su pixman. Dovrai adattarlo per altri progetti autoconf/automake/glibtool, ma ottieni l'idea generale. –

Problemi correlati