Tôi đang cố gắng tìm cách tốt nhất để đóng gói một thư viện tĩnh (cho phép gọi là Lib1) bao gồm một lớp tùy chọn (ví dụ: ClassA), bản thân nó yêu cầu một thư viện tĩnh thứ hai (Lib2). Nói cách khác, Lib2 chỉ cần thiết nếu ClassA được tham chiếu trong mã của dự án. Mọi thứ dường như hoạt động tốt, trừ khi Lib1 được sử dụng trong một dự án không sử dụng ClassA (và do đó không bao gồm Lib2), nhưng yêu cầu cờ liên kết -ObjC (vì các phụ thuộc dự án khác, không phải của tôi).ObjC: Cách biên dịch thư viện tĩnh bao gồm các lớp tùy chọn phụ thuộc vào thư viện của bên thứ ba
Tôi đang cố gắng để tìm ra một giải pháp dễ dàng cho ba kịch bản sau đây:
1) dự án bao gồm lib tĩnh của tôi, KHÔNG sử dụng lớp tùy chọn, không xác định cờ -ObjC
2) dự án bao gồm lib tĩnh của tôi, KHÔNG sử dụng lớp tùy chọn, nhưng yêu cầu -ObjC flag
3) dự án bao gồm thư viện tĩnh static + thứ hai của tôi và DOES sử dụng lớp tùy chọn (chúng tôi không quan tâm đến cờ -ObjC tại điểm này)
Có một lá cờ liên kết để tách lớp tùy chọn ra khỏi ứng dụng dự án cuối cùng để không yêu cầu lib tĩnh thứ hai không? Tôi đoán các lựa chọn thay thế khác của tôi là phát hành nhiều phiên bản lib tĩnh của tôi, một phiên bản bao gồm lớp tùy chọn (lựa chọn tiêu chuẩn), không có (lựa chọn thay thế, cho các dự án có yêu cầu -BjC), hoặc có thể cung cấp tệp sơ khai, cung cấp các triển khai rỗng của tất cả các lớp cần thiết từ thư viện tĩnh thứ hai? Điều này có vẻ như nó có thể là một vấn đề phổ biến trong thế giới thư viện tĩnh ... là có một thực hành tốt nhất cho kịch bản này?
Cảm ơn!
Giải pháp:
1) Đề nghị cho người dùng -ObjC của tôi mà họ sử dụng -force_load để thay thế. (nhờ Rob!)
2) Đối với người dùng không thể thực hiện 1, tôi sẽ có một bản dựng thay thế không bao gồm ClassA
Cảm ơn bạn đã liên kết, họ đã giúp tôi hiểu rõ hơn về trang điểm của một lib tĩnh! –
Tôi không thực sự gói bất kỳ lib tĩnh nào vào lib tĩnh của mình. Trong lib tĩnh của tôi (gọi nó là Lib1), tôi có một lớp (nói ClassA) mà phụ thuộc vào một lib tĩnh (Lib2) đang được liên kết vào ứng dụng. ClassA sẽ không bao giờ được sử dụng nếu không có Lib2. Dường như trình biên dịch/trình liên kết đủ thông minh để loại bỏ ClassA khỏi ứng dụng cuối cùng, nếu nó không được sử dụng. Tuy nhiên, nếu cờ liên kết -ObjC được chỉ định, trình biên dịch/trình liên kết cố gắng giải quyết các phụ thuộc Lib2 của ClassA, nhưng không thể ... bất kể ClassA có được tham chiếu trong ứng dụng hay không. Tôi đã hy vọng cho một lá cờ liên kết ma thuật mà sẽ loại bỏ ClassA –
Cập nhật với một số suy nghĩ. Không dễ để sửa lỗi này. ObjC rất năng động và hoàn toàn bình thường khi tham chiếu các lớp trong thời gian chạy theo cách mà trình liên kết không thể nhìn thấy ở thời gian liên kết (tải nib được thực hiện theo cách này). Rất khó để người liên kết có được quyền này nếu bạn đặt tất cả mọi thứ trong cùng một tệp mà không truyền tham số -force_load riêng lẻ thay vì tham số -ObjC lớn. –