我正在努力創建一個我希望銷售的iOS靜態庫。我已經完成了初始構建的步驟並生成了.a/.h輸出。隱藏靜態庫中的代碼(iOS Obj-C)
當我將這些文件包含在單獨的項目中時,我沒有看到任何方式瀏覽.a文件中的內容。然而,當我的庫中的一行代碼崩潰了應用程序(就像我說的,它仍在開發中),調試器向我顯示了整個類(.m)文件。這是怎麼回事?
我真的不明白什麼都進入靜態庫,我不知道我編譯該版本的模擬器和設備。這可能與它有關嗎?如果是這樣,有人可以解釋爲什麼?
謝謝!
我正在努力創建一個我希望銷售的iOS靜態庫。我已經完成了初始構建的步驟並生成了.a/.h輸出。隱藏靜態庫中的代碼(iOS Obj-C)
當我將這些文件包含在單獨的項目中時,我沒有看到任何方式瀏覽.a文件中的內容。然而,當我的庫中的一行代碼崩潰了應用程序(就像我說的,它仍在開發中),調試器向我顯示了整個類(.m)文件。這是怎麼回事?
我真的不明白什麼都進入靜態庫,我不知道我編譯該版本的模擬器和設備。這可能與它有關嗎?如果是這樣,有人可以解釋爲什麼?
謝謝!
別擔心,您的源代碼不包含在檔案(.a)文件中。
Xcode非常聰明,可以根據嵌入在文件中的調試信息,在您的計算機上找到源代碼文件。如果使用「Release」配置構建庫(或者修改構建設置以使調試符號被剝離),並且沒有源機器上的任何位置,開發人員將不得不訴諸於他們對x86或ARM的瞭解組裝來弄清楚你的代碼是如何工作的。
順便說一句:
由於大量的Objective-C的在運行時處理,大量的類名和選擇的名稱將在您的庫可見。這就是它的工作原理。你可以試着對它進行混淆,但我認爲你花時間寫更有用的代碼來賣。
如果你想給人們對於iOS開發靜態庫,你要建立的iPhone模擬器(86)和iOS設備的版本(ARM),然後使用lipo
將它們組合成一個單一的脂肪靜態庫。四處搜尋「lipo xcode胖靜態庫」以進行此操作。有些解決方案比其他解決方案更復雜。
objective c使得這很容易,因爲它將呼叫者信息直接加載到寄存器:) –
好吧,所以你說XCode實際上是在爲我的計算機搜尋源代碼,只是爲了讓我失去自我?!?!!@!?我環顧四周,看到「建立一個胖庫」,但我仍然很早就開始了,主要還在測試我的庫。基本上,1.建立在發佈模式(模擬器和設備),2.導入庫到一個單獨的項目,3.確保源不在機器上,和4.我將無法瀏覽類,如果失敗發生?涼!謝謝! – mbm29414
如果出錯,你會得到一個錯誤,但不是在一個特定的地方,很可能它會給你錯誤的地址,也可能是導致錯誤的數據(無效地址或其他) –
如果您有您的計算機上的所有.m文件然後這個庫(某文件)的每個副本將與.m文件,而在Xcode調試來symbolicated靜態庫的項目。
xCode不會通過您的所有磁盤搜索適當的.m文件。它知道原始項目的地方。所以如果你只分發庫,它完全隱藏你的初始代碼。
要確保您可以在某個新項目中複製庫,然後清除庫項目中的.m文件。 從此刻開始,任何試圖調試庫的方法的嘗試都會在屏幕上顯示空文件。
我有同樣的問題。 @benzado是正確的,他所提到的。但我不得不去掉調試符號來解決問題。爲此,我必須在構建之前更改項目庫的構建設置,如下所述。
選擇您的目標並轉至構建設置。設置
看的,是這些爲,參照Apple Build Setting Reference
,並建立使用 」釋放「 庫組態。這對我有效。
刪除與您的庫相關聯的dSYM目錄,導致您的應用程序崩潰,無法使用源代碼。即dSYM - 符號表 - 提供了庫和源之間的映射。 – bbum
調試器向您顯示Xcode項目中的文件。源代碼不存儲在.a文件中。 (這樣做會導致大量的「代碼膨脹」,因此甚至不考慮安全問題,因此顯然是不希望的。) –