2012-04-05 64 views
4

穿上你的C++忍者巫毒手套。修改編譯的靜態庫

我們購買了第三方庫供我們的iOS應用使用。該庫有兩個版本,所以我們稱它們爲bull_frog_noises.atoad_frog_noises.a

該公司從來沒有想過會有人想使青蛙的聲音在一個的應用程序,讓每個庫提供相同的方法名

MAKE_FROG_NOISE(); 

有沒有一種辦法重建或修改這些庫,以便它們都可以在不相互碰撞的情況下使用?這裏是理想狀態:

MAKE_BULL_FROG_NOISE(); 
MAKE_TOAD_FROG_NOISE(); 
+4

你不能在ios中動態加載一個庫。它們被編譯成應用程序,這樣你就無法通過蘋果審批流程嚮應用程序提供更多功能。 – 2012-04-05 22:14:31

+0

謝謝拉斐爾 - 我不想讓人們陷入動態加載的想法,所以我刪除了這部分問題。 – bendytree 2012-04-05 22:22:18

回答

4

我會嘗試使用十六進制編輯器手動修改其中一個庫,以便每個MAKE_FROG_NOISE實例都被替換爲MAKE_TOAD_NOISE。你必須非常小心才能做出這樣的改變。您只能替換字節。不要插入或刪除任何東西。並且不要更改文件中的其他內容。

+0

這工作,但它很棘手。你已經重命名了你使用的方法以及它們使用的私有方法,如果它們相互衝突的話。無論如何,我用'Hex Fiend'來重命名每種方法的一個字母,現在我可以並排運行它們。 – bendytree 2012-04-06 03:06:07

3

你可以建立另一個靜態庫作爲包裝與你想要的,然後再方法名的庫包含在項目的包裝庫。

這樣的:

1 - 創建一個名爲bull_frog_noises_wrapper.a一個新的靜態庫項目。

2 - 將bull_frog_noises.a作爲依賴項添加到這個新創建的庫中。

3 - 創建方法是這樣的:

void MAKE_BULL_FROG_NOISE() 
{ 
    MAKE_FROG_NOISE(); 
} 

4 - 不要爲toad_frog_noises.a一樣,創建類似的方法:

void MAKE_TOAD_FROG_NOISE() 
{ 
    MAKE_FROG_NOISE(); 
} 

5 - 在你的項目中添加這些包裝和你'重做。

只需小心在主項目中使用的頭文件,以免它們與內部庫衝突。

希望它有幫助。

+0

那麼這會妨礙圖書館的內部運作互相踐踏嗎?例如,如果'MAKE_FROG_NOISE()'方法都調用像'PREPARE_NOISE()'這樣的方法會怎麼樣?正確的方法會被調用嗎? – bendytree 2012-04-05 22:30:24

+1

這並不能解決問題,因爲所有東西仍然需要連接在一起,這就是發生碰撞的地方。 – 2012-04-05 22:32:33

+1

這就是爲什麼我告訴創建2個分離的庫。每個圖書館將建立獨立。 toad_frog_noises.a包含一組只包含在toad_frog_noises_wrapper.a中的頭文件,而另一個庫文件將執行相同的操作。方法的鏈接部分發生在包裝庫中,而不是項目本身。 – 2012-04-05 22:35:51