2014-11-07 10 views
5

Mam pobrane najnowsze biblioteki libgcrypt & libgpg-błąd z https://www.gnupg.org/download/index.html. Z powodzeniem zbudowałem (wiersz poleceń) obie biblioteki przy użyciu ./configure --enable-static --disable-shared; robić ; zainstaluj na moim Macu (Mavericks w/OSX 10.10 & najnowszy Xcode 6.1).Krzyża kompilacja libgcrypt static lib do użytku na iOS

Mogę połączyć dobrze z tymi nowymi bibliotekami z aplikacji klienckiej OS X, którą buduję. Jak na razie dobrze. Po prostu perfekcyjnie. ALE, potrzebuję również zbudować klienta iOS używając tego samego dokładnego kodu źródłowego.

Pytania:

1) Jakie są zmiany w sekwencji build wiersza polecenia dla biblioteki musiałbym zbudować uniwersalną statyczną bibliotekę dla (symulator, Mac & iOS)? 2) Czy muszę utworzyć osobne statyczne biblioteki dla systemu iOS? A jeśli tak, to jeszcze raz, jaka magia linii poleceń byłaby potrzebna do osiągnięcia właściwej architektury docelowej?

Odpowiedz

12

Należy pamiętać, że nie można zbudować uniwersalnej biblioteki, która będzie działać zarówno w Symulatorach iOS, jak iw systemie MacOS. iOS/Intel i macOS/Intel nie są kompatybilne z ABI nad biblioteką wykonawczą C (Libc). Ta odpowiedź służy do pokazania, w jaki sposób przekompilować projekty oparte na autoconfach dla celów systemu iOS, a następnie można łatwo połączyć powstałe statyczne archiwa.

Będziemy chcieli zrobić coś takiego:

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

Właśnie rzucił ten scenariusz razem i zweryfikowała to działa (z dodatkiem testów --disable-libpng i pomijanie) dla pixman. Prawdopodobnie będziesz musiał dostosować go do libgcrypt, ale pokazuje ogólny wzór budowania projektów opartych na autoconf/automake/glibtool na iOS.

Po zbudowaniu, będziesz mieć zawartość ~/{DEVICE_ARM {, 64}, SIM_ {i386, x86_64}} i możesz albo połączyć biblioteki statyczne albo po prostu użyć ich wszystkich w swoim projekcie (linker wyśle ​​ostrzeżenia o brakujących plasterkach dla "innych" archiwów, które możesz zignorować).

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

Czy możesz być jednoznaczny, ponieważ nie jestem całkowicie zaznajomiony z niuansami typów konfiguracji. Zauważyłem, że config.log tworzy wiele architektury #error Unsupported. –

+0

OK, zaktualizowałem odpowiedź, by była jeszcze bardziej wyraźna. Napisałem skrypt i przetestowałem go na pixmanie. Będziesz musiał dostosować go do innych projektów autoconf/automake/glibtool, ale masz ogólny pomysł. –

Powiązane problemy