2010-05-08 11 views
15

Wiem, że to pytanie zostało zadane kilka razy, ale mój cel jest nieco inny w odniesieniu do tego, co znalazłem w sieci. W szczególności już jestem w stanie zbudować bibliotekę statyczną dla iPhone'a, ale ostateczny plik tłuszczu, który jestem w stanie zbudować, zawiera tylko architektury arm i i386 (i nie jestem pewien, do czego odnosi się ramię: czy v6 czy v7?). Nie jestem w stanie skompilować specjalnie dla armv6 i armv7 i scalić obie architektury za pomocą lipo. Narzędzie lipo narzeka, że ​​ta sama architektura (ramię, nie armv6 lub armv7) jest obecna w obu bibliotekach armv6 i armv7.Jak skompilować bibliotekę statyczną (gruby) dla armv6, armv7 i i386

Czy ktoś może dokładnie wyjaśnić, jak zbudować zbrojenie dla armv6 i armv7, a następnie połączyć te biblioteki w gruby plik za pomocą lipo?

EDYTOWANIE: Potrzebuję zbudować nie używając Xcode, ale kompilując bezpośrednio tradycyjną bibliotekę unix.

Odpowiedz

7

Wystarczy użyć libtool połączyć dwie wersje arm6 i ARM7 razem - jego XCode co robi. Jednak będziesz miał problemy, jeśli spróbujesz połączyć te statyczne biblioteki w nową super-bibliotekę. Jeśli musisz to zrobić, przeczytaj this.

Jeśli robisz to już, to dlatego lipo narzeka, że ​​twoja biblioteka "armv6" zawiera zarówno armv6, jak i armv7. Mój post ma poprawkę, która prawdopodobnie będzie dla ciebie łatwiejsza, ponieważ nie używasz XCode, ale w zasadzie używasz lipo-extract, aby upewnić się, że masz cienką bibliotekę armv6 i cienką bibliotekę armv7, zanim przejdziesz dalej.

2

Upewnij się, że ustawienia kompilacji są ustawione na Valid Architectures: armv6 armv7 i Architectures: Optimized (armv6 armv7). Powinno to skutkować zoptymalizowaniem binarnym zarówno dla v6 & v7. Jeśli nie jesteś pewien, że to się udało, po prostu ustaw Architectures: Standard (armv6) i porównaj rozmiary plików. Zoptymalizowane powinno dawać podwójną wielkość (jeśli dobrze pamiętam).

Zawsze możesz użyć lipo -info na swoim binarnym, aby zobaczyć wszystkie dołączone archiwa.

Running go na kompilacji dystrybucji mojej aplikacji daje mi:

ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My 
Architectures in the fat file: My are: armv6 armv7 
+0

Przepraszam, zapomniałem wspomnieć, że muszę to zbudować, nie używając Xcode, lecz kompilując bezpośrednio tradycyjną bibliotekę unixów. Edytuję swoją odpowiedź, aby odzwierciedlić ten fakt. –

2

Wydaje się, że nie ma potrzeby wyodrębniania z biblioteki tłuszczu przed ponownym dołączeniem (jak opisano w odpowiedzi Jamiego). Używam ostatecznego zestawu SDK 4.0 od Apple, który domyślnie tworzy biblioteki tłuszczu armv6/armv7.

byłem wcześniej określający architekturę lib wejściowego tak:

$DEVROOT/usr/bin/lipo -arch arm $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

To nie na późniejszych SDK, ale usunięcie architektury z (obecnie tłuszczu) uzbroić lib działa dobrze:

$DEVROOT/usr/bin/lipo $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Lipo musi teraz być w stanie wykryć architektury w tłustych bibliotekach.

10

Tutaj jest dobrym rozwiązaniem, że znaleziono: Static Libs With Support to iOS 5 and Arm64

Zmieniano:

Roztwór do tworzenia różnych architektur oddzielone czym wiążą się nimi za pomocą lipo przez zastosowanie linii sterowania (lub Rakefile).

najpierw zbudować binarny z ramienia za pomocą xcodebuild:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='armv7 armv7s' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-arm' BUILT_PRODUCTS_DIR='./build-arm' 

pamiętać, że trzeba ustawić IPHONEOS_DEPLOYMENT_TARGET = „5.0” i architekturach = „ARMv7 armv7s”, zaleca się ustawić budować i produktowe katalogi dokonać rzeczy bardziej zrozumiałe, zajrzyj do podręcznika Build Setting Reference, aby dowiedzieć się więcej na temat znaczenia tej flagi.

Następny build dla arm64:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-arm64' BUILT_PRODUCTS_DIR='./build-arm64' 

zauważyć różnicę na Łuki i IPHONEOS_DEPLOYMENT_TARGET. Musimy również budować na symulatorze, w tym przypadku musimy zmienić SDK do iphonesimulator7.0 i budować w dwóch etapach pierwszy dla i386:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-i386' BUILT_PRODUCTS_DIR='./build-i386' 

Teraz najtrudniejsza część! Jeśli po prostu zmienisz ARCHS na x86_86 w zależności od ustawienia Xcode, pojawi się błąd: "x86_64 nie jest prawidłowym łukiem". Aby tego uniknąć wystarczy dodać VALID_ARCHS = „x86_64”:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-x86_64' BUILT_PRODUCTS_DIR='./build-x86_64' 

Wreszcie musimy tylko stworzyć tłuszczu binarne z wszystkich 5 architektur:

lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a' 

Autorka stworzyła pracy przykład tego, ty można dostać go: https://github.com/diogot/StaticLibDemo


Oto link do postu: Static Libs With Support to iOS 5 and Arm64

Wszystkie kredyty otrzymują Diogo Tridapalli.

+0

Dzięki za wiadomość! @kleopatra – Yang

+0

Dzięki za kredyty @yang! –

Powiązane problemy