2010-10-23 73 views
8

我想建立一個靜態庫,我可以使用ios3.x和ios4.x.我可以用ios3.0構建一個靜態庫,它可以與ios3.0中的另一個項目一起工作,但不會在ios4中編譯。從ios4到ios3也是如此。如何建立通用的ios靜態庫

下面是如何重現:

  1. 開放的XCode 3.2.4,並開始一個新的項目,這是一個可可觸摸靜態庫稱爲Library4
  2. 單擊類文件夾,並創建一個名爲「TestViewController」新的UIViewController
  3. 右鍵單擊Frameworks文件夾,添加現有框架,選擇UIKit
  4. 在左側窗格中,展開目標,右鍵單擊我的圖書館目標並單擊獲取信息。更改爲所有配置,將基礎sdk更改爲iphone模擬器4.0,將ios部署目標更改爲ios3.0
  5. 單擊具有二進制文件的鏈接庫文件夾。在右窗格中,兩者的角色改變爲「弱」
  6. 構建庫
  7. 開放的Xcode 3.2.2和啓動名爲Library4Test
  8. 複製TestViewController.h的類新的基於瀏覽應用程序文件夾
  9. 將libLibrary4.a文件複製到框架文件夾。它會自動添加到目標的鏈接器階段
  10. 右鍵單擊Library4Test目標並單擊獲取信息。在其他連接標誌,添加「-ObjC」和「-all_load」
  11. 在應用程序委託頭添加導入「TestViewController.h」
  12. 在App委託頭的應用的didFinishLaunchingWithOptions方法中添加

    TestViewController *測試= [TestViewController alloc] init;

  13. 編譯ios3.0模擬器

我編譯時得到:

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

對於只是希望建立一個靜態IOS庫的人來說:http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4 – 2012-10-08 08:25:32

回答

2

不知道確切,但它看起來像一個連接問題(所有這些東西的.o)。以下是我設置iOS靜態庫的方法。這是一件非常簡單的事情,但它有效。

  1. 啓動一個新項目,並選擇iOS的Libarary >>可可觸摸靜態庫
  2. 添加一些類。 Mine是UIView上的類別,可以更好地描述在NSLog中的使用。
  3. 選擇目標並確保將每個類的角色設置爲適當的值。在我的類別應該是「公開」的情況下。
  4. 雙擊目標並選擇「生成」選項卡。
  5. 選擇配置發佈和設置以下構建設置:
  6. 部署位置是(檢查)
    部署後處理是(檢查)
    安裝建設 產品定位/

建立你的靜態庫。默認情況下,它將構建在/ usr/local/lib中

現在創建一個符號鏈接,以便於訪問新庫。一個簡單的方法就是打開你的終端,運行以下命令:

cd ~  
ln -s /usr/local/lib 

現在打開你想用你的庫中的Xcode項目。創建一個名爲Libraries或類似的組,按住Ctrl並單擊並使用「添加現有文件」添加庫。它會被稱爲像libYourLibrary.a 當你運行你的項目,你會得到一個鏈接錯誤。所以雙擊項目文件,選擇Build >>所有配置和下面的值添加到「庫搜索路徑」設置:〜/ lib目錄

+0

我只是創造了一個問題,你可能在這裏回答,但我不確定。這裏是:http://stackoverflow.com/q/26597889/1735836 – Patricia 2014-10-27 22:32:37

0

方式,您只需通過SDK創建一個目標?我爲iOS-OSx創建了一個靜態庫,過程更簡單。

  1. 創建項目(從iOS的模板 「可可觸摸靜態庫」)
  2. 添加源文件
  3. 添加一個目標SDK

當然,我必須添加一些

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

代碼。你可以添加你自己的條件。

0

編譯器錯誤正在發生,因爲您沒有鏈接到正確的系統框架。所有暗紅色的符號都來自Foundation.framework,UIKit.framework和libobjc.dylib。

靜態庫不會自動引入它們需要鏈接的必需框架,因此當您使用它們時,必須將它們自己添加到項目中。