2011-10-17 39 views
10

Khi tôi cố gắng chạy ứng dụng của tôi trong iOS 4.3 mô phỏng (Xcode 4.2), tôi sụp đổ khi tôi nhấn @autoreleasepool {}, với:có điều kiện liên kết cho @autoreleasepool

dyld: lazy symbol binding failed: Symbol not found: _objc_autoreleasePoolPush 

Tôi nhìn xung quanh, và tôi xem giải pháp thay thế là thêm libarclite_iphoneos.a. Có một phiên bản của điều này cho giả lập, quá, như libarclite_iphonesimulator.a.

Tôi cần thêm cả hai thư viện vào dự án của mình để làm cho nó chạy trên cả trình mô phỏng và phần cứng. Nhưng bất cứ điều gì tôi xây dựng, nó phàn nàn rằng thư viện khác là dành cho một kiến ​​trúc không được hỗ trợ.

Ví dụ, xây dựng cho mô phỏng:

ld: warning: ignoring file /Developer-4.2/Platforms/iPhoneOS.platform/ 
Developer/usr/lib/arc/libarclite_iphoneos.a, missing required architecture 
i386 in file 

Làm thế nào để sửa chữa cả hai cùng một lúc? Hoặc tôi có nên gắn bó với cú pháp cũ NSAutoreleasePool bây giờ không?

+0

Dường như vấn đề về sự cố kể từ khi thay đổi trình biên dịch trong cài đặt bản dựng cho llvm-gcc-4.2 đã khắc phục sự cố cho tôi –

+0

Tôi nghĩ rằng nó đã được khắc phục kể từ đó; Tôi đã không chạy vào nó trong tháng. –

Trả lời

10

Sau một thử nghiệm như thư mục sạch, sạch, đặt lại iPhone Simulator và thậm chí khởi động lại, tôi đã thay đổi IPHONE_DEPLYMENT_TARGET trên cài đặt xây dựng mục tiêu từ iOS 5.0 xuống iOS 4.2. Đã hoạt động.

+0

Tôi sẽ kiểm tra lại, có thể nó đã được sửa. Cảm ơn. –

+0

@amosel: bạn đang sử dụng phiên bản xcode nào? 4.2. hoặc 4.2.1? –

+0

@JohannesRudolph Tôi sử dụng 4,2 Build 4D199 – amosel

1

Bạn có thể sử dụng cài đặt xây dựng Liên kết cờ khác để liên kết trong thư viện và chuyên giá trị dựa trên đó là "Mọi iOS" hay "Trình mô phỏng iOS bất kỳ".

+0

Điều này có vẻ như nó sẽ hoạt động. Tôi đang giải quyết nó. :) –

+1

@StevenFisher: Tôi khá hoang mang về lý do tại sao điều này là cần thiết ngay từ đầu. Clang nên liên kết trong thư viện thích hợp cho bạn khi mục tiêu triển khai của bạn được đặt trước 5.0. –

+0

Điểm tốt. Tôi đã làm một số thử nghiệm thêm. Có vẻ như đó là vấn đề khi biên dịch chỉ cho trình mô phỏng. Khi biên dịch cho thiết bị, nó sẽ tự động bao gồm thiết bị. Tôi đã phải thêm '$ {PLATFORM_DEVELOPER_USR_DIR}/lib/arc' vào' LIBRARY_SEARCH_PATHS' và '-larclite_iphonesimulator' vào' OTHER_LDFLAGS [sdk = iphonesimulator *] [arch = *] ', nhưng không cần phải thiết lập cho Phần cứng iOS. Vì vậy, điều này gần như chắc chắn là một lỗi. –

0

Bạn cũng có thể hợp nhất hai thư viện tĩnh vào một thư viện chung. Tới nhà ga và nói

lipo -create -output /where/you/want/it/libarclite_universal.a /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphonesimulator.a 

Bạn có thể xác minh các tập tin kết quả bằng cách nói (trong Terminal)

file /where/you/put/it/libarclite_universal.a 

Nó nên đầu ra:

libarclite_universal.a: Mach-O universal binary with 3 architectures 
libarclite_universal.a (for architecture i386):current ar archive random library 
libarclite_universal.a (for architecture armv6):current ar archive random library 
libarclite_universal.a (for architecture armv7):current ar archive random library 

Kể từ lib này được liên kết tĩnh, ứng dụng cuối cùng của bạn sẽ không phát triển vì thư viện sim được bao gồm vì chỉ ứng dụng nào của bạn sẽ cần được liên kết vào ứng dụng cuối cùng của bạn.

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