2010-10-23 17 views
8

Tôi đang cố gắng xây dựng một thư viện tĩnh mà tôi có thể sử dụng với cả ios3.x và ios4.x. Tôi có thể xây dựng một thư viện tĩnh với ios3.0 mà làm việc với một dự án khác trong ios3.0 nhưng sẽ không biên dịch trong ios4. Điều này cũng đúng từ ios4 đến ios3.Cách xây dựng thư viện tĩnh ios phổ dụng

Dưới đây là làm thế nào để tái tạo:

  1. mở XCode 3.2.4 và bắt đầu một dự án mới đó là một Cocoa Touch Thư viện tĩnh gọi Library4
  2. Bấm vào thư mục lớp học và tạo ra một UIViewController mới có tên "TestViewController"
  3. Nhấp chuột phải vào thư mục Khung, thêm khung hiện có, chọn UIKit
  4. Trong bảng điều khiển bên trái, mở rộng mục tiêu, nhấp chuột phải vào mục tiêu thư viện của tôi và nhấp vào nhận thông tin. Thay đổi tất cả cấu hình, Thay đổi sdk cơ sở thành mô phỏng iphone 4.0, thay đổi mục tiêu triển khai ios thành ios3.0
  5. Nhấp vào thư mục Liên kết Thư mục với Thư mục. Trong ngăn bên phải, thay đổi vai trò của cả hai để "Yếu"
  6. Xây dựng Thư viện
  7. Mở Xcode 3.2.2 và bắt đầu một Xem dựa trên ứng dụng mới gọi là Library4Test
  8. Sao chép TestViewController.h để các lớp thư mục
  9. Sao chép tệp libLibrary4.a vào thư mục khung công tác. Nó tự động được thêm vào giai đoạn liên kết của mục tiêu
  10. Nhấp chuột phải vào Library4Test Target và nhấp vào nhận thông tin. Trong cờ mối liên kết khác, thêm "-ObjC" và "-all_load"
  11. trong tiêu đề ứng dụng đại biểu thêm Nhập "TestViewController.h"
  12. TRÊN phương pháp didFinishLaunchingWithOptions ứng dụng của các đại biểu tiêu đề của ứng dụng thêm

    TestViewController * kiểm tra = [TestViewController alloc] init;

  13. Compile với ios3.0 giả

Khi tôi biên soạn tôi nhận được:

Ld build/Debug-iphonesimulator/library4Test.app/library4Test normal i386 
cd /Users/test/Documents/Testing/library4Test 
setenv MACOSX_DEPLOYMENT_TARGET 10.5 
setenv PATH "/Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/GrandpaIPhone/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" 
/Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk -L/Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator -L/Users/test/Documents/Testing/library4Test -F/Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator -filelist /Users/test/Documents/Testing/library4Test/build/library4Test.build/Debug-iphonesimulator/library4Test.build/Objects-normal/i386/library4Test.LinkFileList -mmacosx-version-min=10.5 -framework Foundation -framework UIKit -framework CoreGraphics -llibrary4_1 -o /Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator/library4Test.app/library4Test 

Undefined symbols: 
"_objc_msgSendSuper2", referenced from: 
-TestViewController didReceiveMemoryWarning in liblibrary4_1.a(TestViewController.o) 
-TestViewController viewDidUnload in liblibrary4_1.a(TestViewController.o) 
-TestViewController dealloc in liblibrary4_1.a(TestViewController.o) 
"__objc_empty_vtable", referenced from: 
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
_OBJC_CLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
"_OBJC_CLASS_$_UIViewController", referenced from: 
_OBJC_CLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
"_OBJC_METACLASS_$_UIViewController", referenced from: 
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
".objc_class_name_TestViewController", referenced from: 
[email protected][email protected][email protected] in library4_1os3TestAppDelegate.o 
"_OBJC_METACLASS_$_NSObject", referenced from: 
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o) 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
+0

Đối với những người chỉ muốn xây dựng một lib IOS tĩnh: http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4 –

Trả lời

2

Không chắc chắn chính xác, nhưng có vẻ như một vấn đề liên kết (tất cả những điều .o). Đây là cách tôi thiết lập thư viện tĩnh iOS của mình. Đó là một điều rất đơn giản, nhưng nó hoạt động.

  1. Bắt đầu một dự án mới và chọn iOS Libarary >> Cocoa Touch Thư viện tĩnh
  2. Thêm một số lớp. Của tôi là các loại trên UIView cho mô tả tốt hơn để sử dụng trong NSLog.
  3. Chọn mục tiêu và đảm bảo vai trò của mỗi lớp được đặt thành giá trị phù hợp. Trong trường hợp các danh mục của tôi phải là 'công khai'.
  4. Nhấp đúp vào mục tiêu và chọn tab Xây dựng.
  5. Chọn Release Cấu hình và thiết lập các cài đặt sau xây dựng:
  6. Deployment Location YES (kiểm tra)
    Deployment Postprocessing YES (kiểm tra)
    Lắp đặt Build Sản phẩm Địa điểm/

Xây dựng thư viện tĩnh của bạn. Theo mặc định, nó sẽ xây dựng trong/usr/local/lib

Bây giờ, tạo liên kết tượng trưng để dễ dàng truy cập thư viện mới của bạn. Một cách dễ dàng là mở thiết bị đầu cuối của bạn và chạy các lệnh sau:

cd ~  
ln -s /usr/local/lib 

Bây giờ hãy mở dự án Xcode mà bạn muốn sử dụng thư viện của mình. Tạo một nhóm được gọi là Thư viện hoặc một cái gì đó tương tự, bấm ctrl và sử dụng 'Thêm tệp hiện có' để thêm thư viện. Nó sẽ được gọi là một cái gì đó như libYourLibrary.a Khi bạn chạy dự án của bạn, bạn sẽ nhận được một lỗi liên kết. Vì vậy, hãy nhấp đúp vào tệp dự án, chuyển đến Xây dựng >> Tất cả cấu hình và thêm giá trị sau vào cài đặt "Đường dẫn tìm kiếm thư viện": ~/lib

+0

Tôi chỉ tạo ra một câu hỏi mà bạn có thể trả lời ở đây nhưng tôi không chắc chắn. Đây là: http://stackoverflow.com/q/26597889/1735836 – Patricia

0

Cách bạn tạo một mục tiêu bằng sdk? Tôi tạo một thư viện tĩnh cho iOS-OSx và thủ tục đơn giản hơn rất nhiều.

  1. tạo dự án (từ iOS mẫu "Cocoa touch Library tĩnh")
  2. thêm các tập tin nguồn
  3. thêm một mục tiêu cho sdk

Dĩ nhiên tôi phải thêm một số

#if TARGET_OS_IPHONE 
... 
#else 
... 
#endif 

vào mã. Bạn có thể thêm bạn sở hữu điều kiện.

0

Lỗi trình biên dịch đang xảy ra vì bạn không liên kết với khung hệ thống phù hợp. Tất cả các biểu tượng màu đỏ đậm là từ Foundation.framework, UIKit.framework và libobjc.dylib.

Thư viện tĩnh không tự động kéo các khung được yêu cầu mà chúng cần liên kết, vì vậy khi bạn sử dụng chúng, bạn phải tự thêm chúng vào dự án.