2011-07-13 35 views
10

我正在努力創建一個我希望銷售的iOS靜態庫。我已經完成了初始構建的步驟並生成了.a/.h輸出。隱藏靜態庫中的代碼(iOS Obj-C)

當我將這些文件包含在單獨的項目中時,我沒有看到任何方式瀏覽.a文件中的內容。然而,當我的庫中的一行代碼崩潰了應用程序(就像我說的,它仍在開發中),調試器向我顯示了整個類(.m)文件。這是怎麼回事?

我真的不明白什麼都進入靜態庫,我不知道我編譯該版本的模擬器和設備。這可能與它有關嗎?如果是這樣,有人可以解釋爲什麼?

謝謝!

+0

刪除與您的庫相關聯的dSYM目錄,導致您的應用程序崩潰,無法使用源代碼。即dSYM - 符號表 - 提供了庫和源之間的映射。 – bbum

+0

調試器向您顯示Xcode項目中的文件。源代碼不存儲在.a文件中。 (這樣做會導致大量的「代碼膨脹」,因此甚至不考慮安全問題,因此顯然是不希望的。) –

回答

18

別擔心,您的源代碼不包含在檔案(.a)文件中。

Xcode非常聰明,可以根據嵌入在文件中的調試信息,在您的計算機上找到源代碼文件。如果使用「Release」配置構建庫(或者修改構建設置以使調試符號被剝離),並且沒有源機器上的任何位置,開發人員將不得不訴諸於他們對x86或ARM的瞭解組裝來弄清楚你的代碼是如何工作的。

順便說一句:

  • 由於大量的Objective-C的在運行時處理,大量的類名和選擇的名稱將在您的庫可見。這就是它的工作原理。你可以試着對它進行混淆,但我認爲你花時間寫更有用的代碼來賣。

  • 如果你想給人們對於iOS開發靜態庫,你要建立的iPhone模擬器(86)和iOS設備的版本(ARM),然後使用lipo將它們組合成一個單一的脂肪靜態庫。四處搜尋「lipo xcode胖靜態庫」以進行此操作。有些解決方案比其他解決方案更復雜。

+1

objective c使得這很容易,因爲它將呼叫者信息直接加載到寄存器:) –

+0

好吧,所以你說XCode實際上是在爲我的計算機搜尋源代碼,只是爲了讓我失去自我?!?!!@!?我環顧四周,看到「建立一個胖庫」,但我仍然很早就開始了,主要還在測試我的庫。基本上,1.建立在發佈模式(模擬器和設備),2.導入庫到一個單獨的項目,3.確保源不在機器上,和4.我將無法瀏覽類,如果失敗發生?涼!謝謝! – mbm29414

+0

如果出錯,你會得到一個錯誤,但不是在一個特定的地方,很可能它會給你錯誤的地址,也可能是導致錯誤的數據(無效地址或其他) –

0

如果您有您的計算機上的所有.m文件然後這個庫(某文件)的每個副本將與.m文件,而在Xcode調試來symbolicated靜態庫的項目。

xCode不會通過您的所有磁盤搜索適當的.m文件。它知道原始項目的地方。所以如果你只分發庫,它完全隱藏你的初始代碼。

要確保您可以在某個新項目中複製庫,然後清除庫項目中的.m文件。 從此刻開始,任何試圖調試庫的方法的嘗試都會在屏幕上顯示空文件。

enter image description here

3

我有同樣的問題。 @benzado是正確的,他所提到的。但我不得不去掉調試符號來解決問題。爲此,我必須在構建之前更改項目庫的構建設置,如下所述。

選擇您的目標並轉至構建設置。設置

  1. '地帶調試符號複製在' 到YES
  2. '調試信息格式' 到 '矮跟的dSYM文件'
  3. 生成調試符號'至'N Ø '
  4. ' 符號由默認隱藏 '到' YES

看的,是這些爲,參照Apple Build Setting Reference

,並建立使用 」釋放「 庫組態。這對我有效。