2011-12-04 28 views
12


Một số nền - tôi đã xây dựng một khung tùy chỉnh sử dụng hướng dẫn Diney tại http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/ld: lặp lại biểu tượng _objc_retainedObject trên iOS 4.3, nhưng không phải trên iOS 5.0

của nó được xây dựng cho cả ARMv6/ARMv7, một ARC- của nó khung dựa trên, được biên dịch với mục tiêu depolyment là 4.3.

Khi tôi đặt khung kết quả trong một dự án 5.0, nó hoạt động tốt, nhưng khi tôi đặt nó trong một dự án 4.3 (ARC hoặc không arc, không quan trọng), tôi nhận được những điều mà tôi không thể thực sự hiểu được. ..

Tôi cũng đã thử thêm libarclite.a theo cách thủ công nhưng nó không thay đổi bất cứ điều gì.

ld: trùng lặp biểu tượng _objc_retainedObject trong /Users/freak4pc/Project/MyFramework.framework/MyFramework và /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o) cho kiến ​​trúc ARMv7 lệnh /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang thất bại với mã thoát 1

sẽ đánh giá cao bất kỳ giúp đỡ về vấn đề này.
Cảm ơn
Shai

+0

Tại sao không chỉ xây dựng một thư viện tĩnh như mọi người khác làm cho iOS? Cách tiếp cận mà bạn đã liên kết có vẻ giống như một cái gì đó của một hack, vì vậy tôi không ngạc nhiên rằng mọi thứ có thể không được liên kết như dự định. –

+0

Tôi chỉ có một gợi ý rằng Thư viện tĩnh không linh hoạt. Bạn có thể liên kết tôi với một số tài nguyên về điều này có lẽ? –

+0

Tôi không chắc chắn những gì "ít linh hoạt" có nghĩa là trong trường hợp này. Nếu bạn có mã cho thư viện của mình, có rất ít sự khác biệt trong việc sử dụng giữa một thư viện tĩnh và một khung công tác. Nếu bạn đang phân phối thư viện biên dịch sẵn, tất cả những gì bạn phải làm là đảm bảo rằng các tiêu đề có sẵn. Để biết ví dụ về điều này, hãy xem thư viện Core Plot: http://code.google.com/p/core-plot/, sử dụng khung làm việc cho Mac và thư viện tĩnh cho iOS. Tôi không nhớ nó là khó khăn để thiết lập các biên dịch thư viện tĩnh ở đó. –

Trả lời

15

Tôi đang gặp khó khăn với cùng một vấn đề. Cách giải quyết là thiết lập mục tiêu triển khai của khung công tác của bạn thành iOS5 (kiểm tra xem điều đó có gây ra các vấn đề khác không).

Sau đó, bạn phải sử dụng ARC trong dự án chính nếu nhắm mục tiêu iOS4, nếu không libarclite sẽ bị thiếu. Giải pháp của tôi sẽ là cung cấp hai khung, tùy thuộc vào việc họ có sử dụng ARC hay không.

Dưới đây là hai liên kết đến diễn đàn dev của Apple với một chút biết thêm: https://devforums.apple.com/message/539344#539344

https://devforums.apple.com/message/588316#588316

Cập nhật: Có một cách tốt hơn. Chỉ cần xây dựng thư viện tĩnh của bạn với mục tiêu tối thiểu iOS5 và thêm /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a (và /Developer/usr/lib/arc/libarclite_iphonesimulator.a) nếu thủ công của bạn dự án là không phải bằng ARC và cần hỗ trợ iOS4.

Cập nhật 2: Thực ra, chỉ cần sử dụng cờ liên kết -fobjc-arc; điều này sẽ liên kết libarclite với thư viện nếu nó chưa có trong đó. Giải pháp tốt nhất.

+0

Thats không phải là một ý tưởng tồi, bệnh cho nó một shot! cảm ơn ! –

+0

Cảm ơn bạn, Đó là một cách tốt hơn. thêm /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a (và /Developer/usr/lib/arc/libarclite_iphonesimulator.a) theo cách thủ công – HelloWorld

2

Wow đó là một chuyến đi khó khăn nhưng cuối cùng tôi đã giải quyết được!

gì gây ra các ý tưởng cuối cùng là @ bình luận steipete của, của nó một chút của một tình huống phức tạp vì vậy tôi sẽ cố gắng giải thích nó cho bất cứ ai có thể đã vượt qua vấn đề này là tốt.

  1. Soạn khung có hỗ trợ ARC trên iOS 4.3 sẽ tự động đính kèm libarclite.so vào "cầu nối" 4,3 ARC với 5,0 ARC. Khi khuôn khổ này được nhập vào một dự án 4.3, arclite thực sự được liên kết hai lần - một lần cho khuôn khổ (là 4.3), và một lần cho bản thân dự án - gây ra lỗi "biểu tượng trùng lặp", nghĩa là khung phải được biên dịch 5.0 và dự án có thể là 4.3. Nhưng sau đó ;
  2. Khuôn khổ của tôi đang sử dụng tính năng AFNetworking của @mattt để thực hiện các yêu cầu HTTP và phân tích cú pháp JSON của các AP khác nhau.AFNetworking tự động kiểm tra trong khi biên dịch nếu mục tiêu của bạn là iOS5, và nếu nó là, nó sử dụng NSJSONSerialization, nếu không nó sẽ rơi trở lại bất kỳ thư viện JSON được nhập như JSONKit.
  3. Khi biên dịch khuôn khổ hỗ trợ AFNetworking cho iOS5 (để tránh sự cố số 1), nó sẽ tự động đính kèm NSJSONSerialization, điều này sẽ gây ra ngoại lệ cho 4.3 dự án, nghĩa là bạn phải tìm kiếm các hướng biên dịch theo cách thủ công và xóa gọi tới NSJSONSerialization trước khi biên dịch, vì vậy nó sẽ tự động quay trở lại thư viện tương thích 4.3 (trong trường hợp của tôi là JSONKit). Điều kiện biên dịch này được tìm thấy trên AFHTTPClient.m và AFJSONRequestOperation.m (ví dụ: #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6)
  4. Sau khi loại bỏ các điều kiện đó, tôi đã biên soạn thành công khung cho iOS5 bằng JSONKit thay vì NSJSONSerialization và đã có thể sử dụng thành công trong iOS4.3 của tôi dự án.

Hy vọng điều này sẽ giúp bất kỳ ai khác có thể đấu tranh với điều này trong một vài ngày như bản thân mình :)

Shai.

+0

Thành thật mà nói, tôi không thấy câu trả lời của bạn thêm nhiều giá trị hơn (# 2, # 3 và # 4 thậm chí không liên quan đến câu hỏi), do đó, nó để lại một vị đắng mà bạn đã đánh dấu _your own_ câu trả lời là chính xác. Bạn cũng bỏ lỡ giải thích vấn đề rằng dự án tổng thể của bạn phải sử dụng ARC nếu bạn sử dụng ARC w/o thêm libarclite.so trong một tiểu dự án, nếu nó cần hỗ trợ iOS 4.x. – steipete

+0

Xin lỗi nhưng tôi thực sự không đồng ý với bạn. Tôi không có vấn đề gì để đánh dấu câu trả lời của bạn là "câu trả lời đúng" (tôi không nhận được điểm để tự đánh dấu) - nhưng tôi nghĩ câu trả lời của tôi hoàn chỉnh hơn vì nó giải thích toàn bộ quá trình. 2-3-4 là nguyên nhân khiến tôi không thể sử dụng mẹo của bạn, vì vậy chúng rất có liên quan. Ngoài ra, tôi tin rằng câu hỏi của tôi để gọi whats có liên quan và những gì nó không phải là sự lựa chọn của tôi. Tôi đánh giá cao sự giúp đỡ của bạn rất nhiều, nhưng tôi nghĩ rằng bình luận của bạn ở đây đã được ra khỏi chỗ. –

+1

Phải đồng ý với steipete. "Câu trả lời" của bạn có thể liên quan đến dự án của bạn nhưng không liên quan đến các vấn đề mà chúng tôi đang gặp phải. – wuf810

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