2012-04-26 28 views
11

Tôi đang sử dụng libcurl trong một dự án Mac được xây dựng và biên dịch trên hệ điều hành 10.7 Lion. Tôi có thể liên kết đến thư viện động tốt, sử dụng tùy chọn -lcurl trong Other Linker Flags hoặc bằng cách thêm thư viện vào dự án của tôi. Tất cả mọi thứ hoạt động như nó được cho là.Trong Xcode, làm cách nào để liên kết thư viện động (libcurl) để ứng dụng này cũng hoạt động trên các phiên bản cũ hơn của Mac OS?

Tôi cũng muốn ứng dụng hoạt động trên OS 10.6 và 10.5. Tôi đặt mục tiêu triển khai cho phù hợp. Khi tôi chạy ứng dụng trong một trong các phiên bản của hệ điều hành này, tôi gặp lỗi dyld:

Thư viện không được tải: /usr/lib/libcurl.4.dylib Lý do: Phiên bản thư viện không tương thích: X yêu cầu phiên bản 7.0.0 hoặc mới hơn, nhưng libcurl.4.dylib cung cấp phiên bản 6.0.0.

Đây cũng là vấn đề tương tự đối với Mac OS 10.5.

Làm cách nào để liên kết với thư viện libcurl của hệ thống trong Xcode trên Mac OS 10.7 để ứng dụng cũng chạy trên 10.6 và 10.5?

tôi đã xem xét một vài lựa chọn:

  1. Một là thay đổi SDK Base, như đề xuất trong bài viết này: Mac OS X libcurl dylib compatibility version Nếu tôi làm điều này, việc áp dụng hoạt động tốt. Nhưng đây không phải là một lựa chọn cho tôi. Tôi phải đang sử dụng SDK 10.7, do đó, việc khôi phục phiên bản SDK cũ hơn không được chấp nhận.

  2. Tôi đã thử liên kết yếu với thư viện bằng cách sử dụng tùy chọn -weak_library /usr/lib/libcurl.dylib trong Cờ liên kết khác. Ứng dụng khởi chạy nhưng sau đó đổ vỡ khi tôi cố gắng tham khảo các ký hiệu libcurl. Tuy nhiên, tôi biết nó không phải là một vấn đề với mã không tương thích vì nó hoạt động khi tôi thay đổi Base SDK.

  3. Tôi đã thử tải động thư viện trong mã bằng dlopen ("libcurl.dylib", RTLD_LOCAL | RTLD_LAZY); Thư viện dường như tải, nhưng sau đó tôi phải tự ràng buộc tất cả các ký hiệu mà tôi tham chiếu?

Chắc chắn phải có cách để thực hiện việc này. Thư viện libcurl được cài đặt trên Mac OS 10.5, 10.6 và 10.7, nhưng ứng dụng không sử dụng được thư viện có sẵn trên các phiên bản Mac OS cũ hơn. Làm thế nào tôi có thể sửa lỗi này?

Trả lời

7

Một số tùy chọn:

  • Chuyển từ libcurl đến các API khuôn khổ Mac (CFNetwork, NSURLConnection, vv)
  • xây dựng và đóng gói phiên bản của riêng bạn libcurl với ứng dụng của bạn chứ không phải là dựa vào các thư viện hệ thống .
  • Sao chép hoặc liên kết thư viện gốc từ SDK tương ứng với mục tiêu triển khai của bạn và liên kết với nó bằng một đường dẫn rõ ràng.
+0

Cảm ơn Ken. Tùy chọn đầu tiên sẽ không hoạt động. Tôi đã chạy FTP thông qua SSL và cả CFNetwork lẫn NSURLConnection đều không hỗ trợ nó. Đó chắc chắn là nơi đầu tiên tôi nhìn. =) Tôi chắc chắn muốn tránh đóng gói phiên bản libcurl của riêng tôi với ứng dụng, vì vậy tôi sẽ xem xét việc liên kết đến phần mềm. Mối quan tâm của tôi là tôi đang nhắm mục tiêu 10.5 và tôi thậm chí không biết liệu SDK đó có khả dụng cho Xcode 4.3 trên Lion hay không. – Philip

+1

Tôi đang đánh dấu câu trả lời của bạn là chính xác và đề xuất những người dùng khác theo tùy chọn thứ 3. Một giải pháp làm việc là trên thực tế để có được một phiên bản trước của SDK và sao chép libcurl.4.dylib từ nó vào trong 10.7 Thư mục SDK - hiện được chứa bên trong gói ứng dụng Xcode. Bạn nên sao lưu bản gốc trước. Xcode liên kết với phiên bản thư viện đó trong khi cung cấp cho bạn tiêu đề cho phiên bản mới hơn trong 10.7. Điều này có nghĩa là ứng dụng nên kiểm tra tính khả dụng của các ký hiệu trước khi sử dụng chúng trong mã. – Philip

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