2010-05-08 29 views
15

Tôi biết câu hỏi này đã được đặt ra nhiều lần, nhưng mục tiêu của tôi hơi khác so với những gì tôi tìm thấy trên web. Cụ thể, tôi đã có thể xây dựng một thư viện tĩnh cho iPhone, nhưng tệp chất béo cuối cùng mà tôi có thể xây dựng chỉ chứa kiến ​​trúc cánh tay và kiến ​​trúc i386 (và tôi không chắc chắn những gì cánh tay đề cập: là v6 hoặc v7?). Tôi không thể biên dịch riêng cho armv6 và armv7 và chúng hợp nhất cả hai kiến ​​trúc bằng cách sử dụng lipo. Công cụ lipo phàn nàn rằng cùng một kiến ​​trúc (cánh tay, không armv6 hoặc armv7) có mặt trong cả thư viện armv6 và armv7.Làm cách nào để biên dịch một thư viện tĩnh (chất béo) cho armv6, armv7 và i386

Ai đó có thể giải thích chính xác làm thế nào để xây dựng cho armv6 và armv7, và họ hợp nhất các thư viện vào một tập tin chất béo bằng cách sử dụng lipo?

EDIT: Tôi cần xây dựng không sử dụng Xcode nhưng biên dịch trực tiếp thư viện unix truyền thống.

Trả lời

7

Chỉ cần sử dụng libtool để liên kết hai arm6 và arm7 phiên bản với nhau - những gì XCode của nó không. Tuy nhiên, bạn sẽ gặp vấn đề nếu bạn cố gắng kết hợp các thư viện tĩnh này thành một thư viện siêu mới. Nếu bạn cần làm điều đó thì hãy đọc this.

Nếu bạn đang làm điều này, đó sẽ là lý do tại sao lipo phàn nàn rằng thư viện "armv6" của bạn chứa cả armv6 và armv7. Bài đăng của tôi có bản sửa lỗi có thể dễ dàng hơn cho bạn vì bạn không sử dụng XCode, nhưng về cơ bản bạn sử dụng lipo -extract để đảm bảo bạn có thư viện armv6 mỏng và thư viện armv7 mỏng trước khi bạn tiếp tục.

2

Đảm bảo đặt cài đặt bản dựng của bạn thành Valid Architectures: armv6 armv7Architectures: Optimized (armv6 armv7). Điều này sẽ dẫn đến một nhị phân được tối ưu hóa cho cả v6 & v7. Nếu bạn không chắc chắn nó đã hoạt động, chỉ cần đặt Architectures: Standard (armv6) và so sánh kích thước tệp. Tối ưu hóa sẽ tạo ra gấp đôi kích thước (khi tôi nhớ đúng).

Bạn cũng luôn có thể sử dụng lipo -info trên nhị phân của mình để xem tất cả các kiến ​​trúc được bao gồm.

Chạy nó trên một xây dựng phân phối các ứng dụng của tôi mang lại cho tôi:

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

Xin lỗi, tôi quên đề cập đến rằng tôi cần phải xây dựng điều này không sử dụng Xcode nhưng biên dịch trực tiếp một thư viện unix truyền thống. Tôi đang chỉnh sửa câu trả lời của mình để phản ánh thực tế này. –

2

Có vẻ như không cần phải trích xuất từ ​​thư viện chất béo trước khi liên kết lại nữa (như được mô tả trong câu trả lời của jamie). Tôi đang sử dụng SDK 4.0 cuối cùng từ táo, có vẻ như tạo thư viện armv6/armv7 chất béo theo mặc định.

trước đây tôi đã xác định kiến ​​trúc cho lib đầu vào như sau:

$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 

này không thành công trên SDK sau đó, nhưng loại bỏ các kiến ​​trúc từ (nay là chất béo) tay lib hoạt động tốt:

$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 giờ đây phải có khả năng phát hiện kiến ​​trúc trong thư viện chất béo.

10

Đây là một giải pháp tốt tôi thấy: Static Libs With Support to iOS 5 and Arm64

được sửa đổi:

Giải pháp là để xây dựng kiến ​​trúc khác nhau tách ra sau đó liên kết chúng bằng cách sử lipo, bằng cách sử dụng dòng lệnh (hoặc Rakefile).

Đầu tiên xây dựng các nhị phân với cánh tay sử dụng 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' 

Lưu ý rằng bạn phải thiết lập IPHONEOS_DEPLOYMENT_TARGET = '5.0' và Vòm = 'armv7s ARMv7', nó được đề nghị để thiết lập xây dựng và sản phẩm dirs để làm những điều rõ ràng hơn, hãy xem Tham chiếu cài đặt xây dựng để biết thêm chi tiết về ý nghĩa của cờ này.

Tiếp xây dựng cho 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' 

Lưu ý sự khác biệt trên Vòm và IPHONEOS_DEPLOYMENT_TARGET. Chúng tôi cũng cần phải xây dựng cho mô phỏng, trong trường hợp này chúng ta phải thay đổi sdk để iphonesimulator7.0 và xây dựng theo hai bước đầu tiên cho 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' 

Bây giờ là phần khó khăn! Nếu bạn chỉ cần thay đổi ARCHS thành x86_86 tùy thuộc vào thiết lập Xcode của bạn, bạn sẽ nhận được một lỗi như: "x86_64 không phải là một vòm hợp lệ". Để tránh điều này chỉ cần thêm 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' 

Cuối cùng chúng ta chỉ cần có để tạo ra một nhị phân chất béo với tất cả 5 kiến ​​trúc:

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

Tác giả tạo ra một ví dụ làm việc này, bạn có thể lấy nó: https://github.com/diogot/StaticLibDemo


Dưới đây là liên kết để đăng bài: Static Libs With Support to iOS 5 and Arm64

Tất cả các khoản tín dụng đi đến Diogo Tridapalli.

+0

Cảm ơn bạn đã nói với tôi! @kleopatra – Yang

+0

Cảm ơn tín dụng @yang! –

Các vấn đề liên quan