2011-02-07 21 views
11

Tôi đã một ứng dụng trong đó bao gồm một thư viện bên ngoài tôi phát triển, và tôi nhận được thông báo cảnh báo sau đây mỗi khi tôi biên dịch bằng cách sử dụng thiết bị như mục tiêu:Cách loại bỏ cảnh báo "tệp được tạo cho định dạng tệp không được hỗ trợ" khi liên kết với một thư viện tĩnh?

mylib-release-iphonesimulator.a, nộp được xây dựng cho định dạng tệp không được hỗ trợ không phải là kiến ​​trúc được gắn kết (armv7).

Tôi có 2 phiên bản của thư viện, cả hai đều được thêm vào dự án. Một được xây dựng cho iphonesimulator và một cho iphoneos.

Mặc dù nó hoạt động tốt trên bất kỳ mục tiêu nào (dường như trình biên dịch có phiên bản đúng của thư viện tùy thuộc vào mục tiêu) loại cảnh báo đó trở nên an toàn.

Có cách nào để loại bỏ cảnh báo, hoặc thậm chí tốt hơn biên dịch cả hai nền tảng trên một thư viện duy nhất tránh có 2 tệp nhị phân của cùng một thư viện?

Cảm ơn!

Trả lời

30

Bạn không muốn nhận thoát lỗi này, bạn muốn sửa lỗi.

Vấn đề ở đây là bạn đang liên kết một phiên bản giả của thư viện của bạn vào thiết bị xây dựng các ứng dụng của bạn. Trình giả lập muốn các thư viện trong kiến ​​trúc i386 và thiết bị muốn mọi thứ trong kiến ​​trúc armv6 hoặc armv7.

Vì vậy, giải pháp ở đây là liên kết đúng phiên bản thư viện của bạn.

Điều tôi thường làm là kết hợp chúng thành một thư viện duy nhất và để cho trình liên kết chọn đúng phiên bản cho tôi. Đây là những gì bạn làm trong Terminal:

$ cd /path/to/my/libraries 
$ ls 
    libMyLibrary-Device.a 
    libMyLibrary-Simulator.a 
$ file libMyLibrary-Device.a 
    libMyLibrary-Device.a: Mach-O universal binary with 2 architectures 
    libMyLibrary-Device.a (for architecture armv6): current ar archive random library 
    libMyLibrary-Device.a (for architecture armv7): current ar archive random library 
$ file libMyLibrary-Simulator.a 
    libMyLibrary-Simulator.a: Mach-O universal binary with 1 architecture 
    libMyLibrary-Simulator.a (for architecture i386): current ar archive random library 
$ lipo -create -output libMyLibrary.a libMyLibrary-Device.a libMyLibrary-Simulator.a 
$ ls 
    libMyLibrary-Device.a 
    libMyLibrary-Simulator.a 
    libMyLibrary.a 
$ file libMyLibrary.a 
    libMyLibrary.a: Mach-O universal binary with 3 architectures 
    libMyLibrary.a (for architecture armv6): current ar archive random library 
    libMyLibrary.a (for architecture armv7): current ar archive random library 
    libMyLibrary.a (for architecture i386): current ar archive random library 

Sau đó, bạn chỉ cần liên kết libMyLibrary thay vì phiên bản thiết bị hoặc mô phỏng, và các mối liên kết sẽ làm điều đúng.

+0

Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn nhiều! –

+0

Cảm ơn. Khi bạn xây dựng cho giả lập iphone Trong đó vị trí là thư viện tĩnh mặc dù? – huggie

0

Nếu bạn không muốn kết hợp các thư viện vì lý do nào đó (như có lib gỡ lỗi và lib phát hành), bạn có thể bao gồm các thư viện khác nhau tùy thuộc vào mục tiêu xây dựng của bạn.

Nếu bạn mở thông tin dự án của mình (nhấp chuột phải vào dự án-> Nhận thông tin hoặc đánh dấu nó và nhấp vào nút thông tin) và đi đến phần Liên kết, đánh dấu Cờ liên kết khác và sau đó nhấp vào liên kết trên phía dưới cùng bên trái của màn hình một trong các tùy chọn là Add Build Setting Condition. Nhấp vào đó sẽ cung cấp cho bạn tùy chọn con trong các Cờ liên kết khác, theo mặc định, bất kỳ trình đơn thả xuống SDK và Bất kỳ kiến ​​trúc nào có dòng trống sau. Từ đó bạn có thể thiết lập các cờ liên kết cụ thể (-lmylib-release-iphonesimulator vv) tùy thuộc vào các cài đặt xây dựng khác nhau.

5

Tôi đã gặp vấn đề tương tự với thư viện SQLite 3 (libsqlite3.dylib). Tôi đã mở một dự án cũ hơn và cùng một thư viện được biên soạn. Tôi so sánh Thông tin mục tiêu> Cài đặt xây dựng> Đường dẫn tìm kiếm trên từng dự án và trong khi dự án cũ (đang hoạt động) trống, có nhiều đường dẫn tìm kiếm trong "Đường dẫn tìm kiếm khung" trong dự án mới hơn. Xóa tất cả chúng đã giải quyết được vấn đề. Hy vọng điều này sẽ giúp một ai đó, điều này đã cho tôi nhiều, nhiều giờ để tìm ra.

+0

Nhìn tất cả hơn cho điều này ... tiếp tục loại bỏ và thêm khung iphoneos. Nhưng những con đường đã được tìm kiếm cho khuôn khổ giả lập. Cảm ơn bạn rất nhiều! –

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