2011-10-30 27 views
7

Tôi có dự án với sự phụ thuộc vào thư viện tĩnh của bên thứ ba và ba thư viện. Trong XCode 3.X, để dự án của tôi biên dịch, tôi đã phải sử dụng cờ -force_load trong cài đặt xây dựng "Cờ kết nối khác" và chỉ định từng thư viện ba20 mà tôi muốn đưa vào.Tại sao-force_load không còn cần thiết cho phụ thuộc ba20 của tôi trong XCode 4.2?

Khi cố tạo bản lưu trữ trong XCode 4.2, tôi gặp phải lỗi "biểu tượng trùng lặp". Tôi đã giải quyết vấn đề này bằng cách xóa bảy cờ riêng biệt-force_load đề cập đến từng thư viện trong số ba thư viện mà tôi có một sự phụ thuộc.

Dự án của tôi hiện đã xây dựng thành công.

Tôi tự hỏi liệu có ai đó có thể giải thích lý do tại sao thay đổi này hoạt động không? Có một lỗi mà XCode 4.2 đã sửa, hay là thay đổi hành vi? This post suggests có lỗi trong XCode 3.2, nhưng sẽ rất tuyệt nếu ai đó có thể làm sáng tỏ thêm về chủ đề này cho tôi vì vậy tôi có thể chắc chắn rằng tôi không có khả năng làm điều gì sai bằng cách xóa các cờ -force_load này.

Cảm ơn!

Trả lời

19

Khi xây dựng thư viện tĩnh (theo yêu cầu cho iOS), một trong những vấn đề bạn gặp phải là cách bao gồm các biểu tượng từ các danh mục trong thư viện đó để ứng dụng có thể sử dụng chúng. Cờ liên kết -ObjC sẽ lấy đủ thông tin để bao gồm các danh mục trong các khung được xây dựng này, như Dave Dribin mô tả trong bài viết của mình here.

Tuy nhiên, giữa iPhone OS 2.0 và 3.0, điều này đã ngừng hoạt động. Như tôi đã đề cập trong this answer, chúng tôi đã gặp phải sự cố này trong khung cốt lõi và thấy rằng chúng tôi cần thêm cờ liên kết -all_load để làm cho khung làm việc đúng. Táo tự posted Technical Q&A QA1490 đó đề cập đến vấn đề này:

Đối với 64-bit và các ứng dụng hệ điều hành iPhone, có một lỗi mối liên kết mà ngăn -ObjC từ tải các đối tượng tập tin từ thư viện tĩnh chỉ chứa loại và không có các lớp học. Giải pháp thay thế là sử dụng các cờ -all_load hoặc -force_load.

-all_load buộc trình liên kết tải tất cả các tệp đối tượng từ mọi tệp lưu trữ mà nó thấy, ngay cả những tệp không có mã Objective-C. -force_load là có sẵn trong Xcode 3.2 trở lên. Nó cho phép kiểm soát hạt mịn hơn của tải lưu trữ. Mỗi tùy chọn -force_load phải được theo sau bởi một đường dẫn đến một tệp lưu trữ và mọi tệp đối tượng trong lưu trữ đó sẽ được tải.

Thật không may, tác dụng phụ của việc này là các biểu tượng trùng lặp được liên kết trong từ nhiều thư viện có thể gây ra lỗi giống như những gì bạn gặp phải.

Tôi đã gửi báo cáo lỗi về điều này (vào năm 2009) và có vẻ như phiên bản LLVM mới nhất hiện được sử dụng trong Xcode không còn bị lỗi liên kết này nữa. Tôi đã thử chỉ sử dụng -ObjC với mục tiêu thư viện tĩnh của Core Plot iOS và nó hoạt động tốt ngay bây giờ. Đó là tin mừng.

+0

Tuyệt vời, do đó, nó chắc chắn là một lỗi, và theo kinh nghiệm nó dường như đã được sửa chữa (mặc dù Apple đã không thông báo bất cứ điều gì ...) Cảm ơn bạn! – esilver

+0

Tôi nghĩ rằng bạn vẫn cần -ObjC để tải Danh mục, và điều này vẫn sẽ cung cấp cho bạn "trùng lặp biểu tượng" lỗi nếu bạn làm, còn nguyên vẹn có biểu tượng trùng lặp, phải không? – hooleyhoop

+1

@hooleyhoop - Phải, như tôi nói ở trên, bạn vẫn cần -ObjC cho các danh mục, nhưng trong kinh nghiệm của tôi, loại bỏ cờ liên kết '-all_load' sẽ loại bỏ gần như tất cả các lỗi biểu tượng trùng lặp mà bạn nhìn thấy. Nếu tôi nhớ chính xác, nhiều biểu tượng đến từ các khuôn khổ được liên kết với nhiều thư viện tĩnh, thì cả hai thư viện tĩnh đều được sử dụng trong cùng một ứng dụng. Tất nhiên, '-ObjC' sẽ không bảo vệ bạn khỏi trường hợp các danh mục khác nhau đều xác định cùng tên phương thức như một phần mở rộng cho cùng một lớp, nhưng các quy ước đặt tên thích hợp nên ngăn chặn điều đó. –

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