2012-07-31 49 views
12

Tôi hiện đang có một dự án Xcode đơn cho một cơ sở mã rất lớn, tôi sẽ gọi nó là Project X, mà tôi đang chia thành một loạt các dự án phụ (Dự án A , B, C).Liên kết các thư viện tĩnh, chia sẻ một thư viện tĩnh khác

Cho đến nay, mỗi dự án trong số này đều tự biên soạn. Tất cả chúng đều tạo ra các thư viện tĩnh. Dự án BDự án C phụ thuộc vào thư viện tĩnh được tạo bởi Dự án A để xây dựng.

Tôi có một dự án xcode khác, Project Z, yêu cầu thư viện tĩnh được tạo bởi Dự án B và C. Đây là vấn đề. Khi Dự án Z vào giai đoạn trình liên kết, mọi thứ nổ tung - các ký hiệu trùng lặp được tìm thấy trong các libs cho Dự án B và C cho mã họ liên kết ban đầu trong Project A!

Tôi khá mới với thế giới của các thư viện tĩnh, và tôi không chắc chắn làm thế nào để di chuyển về phía trước với Project Z, hoặc làm thế nào để thay đổi các dự án khác để họ đang liên kết so với cùng Dự án A lib. Tôi có cảm giác là không thể. lựa chọn của tôi là gì đây?

Edit:

tôi nên làm rõ rằng Dự án BDự án C cần phải xây dựng thành libs tĩnh riêng biệt bởi vì một số khách hàng sẽ chỉ yêu cầu một hay khác.

Ngoài ra, tôi đang gặp phải tình huống khó xử này trên cả nền tảng OSX và iOS.

Tôi nhận thấy rằng tôi có thể giải quyết vấn đề này trên OSX bằng cách xây dựng các dự án dưới dạng thư viện động. Tuy nhiên, tôi không muốn làm điều này, và nó vẫn còn lại cho tôi với cùng một vấn đề trên iOS.

Trả lời

16

Thư viện tĩnh không bao giờ nên bao gồm các thư viện tĩnh khác (hoặc mã của bên thứ ba nói chung). Một thư viện tĩnh chỉ là một bó các tệp .o dán lại với nhau. Vì vậy, nếu bạn có nhiều bản sao của cùng một thông tin, nó sẽ nổ tung.

Mỗi thư viện tĩnh chỉ nên có mã riêng trong đó. Ứng dụng cuối cùng chịu trách nhiệm liên kết tất cả các thư viện cần thiết với nhau (bao gồm các thư viện được yêu cầu bởi các thư viện). Bằng cách này, có chính xác một bản sao của mỗi thứ được liên kết.

+1

Vâng, bạn đúng về vấn đề này. Tôi đã giải quyết vấn đề bằng cách đơn giản là không liên kết Dự án B và Dự án C với Dự án A. Dự án B và C vẫn tham chiếu Project A như một phụ thuộc, và vì vậy họ có thể xây dựng tốt. Vì khách hàng sẽ luôn bao gồm Dự án A cùng với các dự án này, tất cả các biểu tượng được tìm thấy và mọi thứ chỉ hoạt động. – Jeff

+0

@ Jeff làm thế nào bạn đã làm cho A là một "phụ thuộc" để những người khác có thể xây dựng, trong khi không thực sự liên kết đến (bao gồm) A trong xây dựng của họ? – johnbakers

+1

@Rob Tôi đã nhận thấy rằng trong Xcode nếu tôi xây dựng một thư viện tĩnh chỉ bao gồm một tiêu đề cho một thư viện khác, nhưng không liên kết đến nhị phân của thư viện khác, xây dựng hoàn thành tốt. Nếu tôi thay vì làm điều này với một dự án chương trình thực tế (không phải là một thư viện) thì có những định nghĩa không xác định trong giai đoạn liên kết (lỗi). Tôi giả sử rằng khi bạn xây dựng một thư viện, "bỏ qua" phần này của giai đoạn liên kết là bình thường, trong khi các chương trình thực tế, khi được xây dựng, thực hiện kiểm tra liên kết bổ sung, có đúng không? (và đó sẽ là những gì trình biên dịch thực sự đang làm nếu nó được hướng dẫn xây dựng một thư viện?) – johnbakers

2

Điều này nghe có vẻ giống như loại sự cố CoacoaPods được tạo để giải quyết. Nếu bạn xác định nhóm cho mỗi dự án đề xuất thì Z sẽ có thể xác định và liên kết với tất cả các phụ thuộc của nó tất cả các cách lên chuỗi mà không đưa ra các biểu tượng trùng lặp.

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