2013-02-11 200 views
8

我正在分發共享庫(C++)和使用此庫的python模塊。我構建了一個Bullet物理圖書館的修改版本(作爲CMake子項目)。 我只在一個文件中使用Bullet類和函數 - bullet_interface.cpp - 並且所有Bullet內容都隱藏在「namespace {...}」中。共享庫名稱衝突

問題是,其他一些庫需要Bullet作爲系統依賴項並鏈接到Bullet的系統版本。實際上,我的庫(libopenrave)的一個依賴項導出了Bullet符號。 (更具體地說,它有時會動態加載一個導出Bullet符號的插件)。

我想知道是否有方法來構建我的庫,以便bullet_interface.cpp使用正確的Bullet函數,但是然後我的庫不會使任何Bullet符號可見。 我不能使用系統項目符號,因爲我必須對源代碼進行更改。 一個拙劣的解決方案是使用搜索和替換來重命名所有的Bullet函數和類(幾乎所有的都包含字符串「bt」)。有沒有更好的辦法?

+1

顯而易見的解決方案是將修補程序放入主Bullet庫中,並將THAT用作系統庫。 – 2013-02-11 21:21:26

+0

你能否確保你的修改版本首先被加載並且滿足其他庫中的所有依賴關係,因此它們不需要系統版本? – 2013-02-11 21:47:36

+1

因此,libopenrave會用子彈庫導出子彈符號和鏈接,而您的插件使用的是完全相同的子彈符號,並隨修改後的子彈庫一起發貨?如果是這樣,您可以嘗試將修改過的子彈庫作爲靜態庫構建,將其鏈接到您的插件中,並確保插件中的所有項目符號都是隱藏的。您的插件代碼將使用它們,但它們不會導出到動態符號表中。如果子彈makefile或代碼屬性明確設置可見性,則必須破解它,也許在鏈接對象之前使用binutils更改符號可見性? – 2013-02-11 21:56:32

回答

2

這是一個迂迴的方式來完成你想要的,但它擊敗了子彈代碼中的搜索和替換。

您可以嘗試使用objcopy工具這樣的「前綴」符號子彈庫:

objcopy --prefix-symbols=old_ bullet.a 

應該與動態庫的工作爲好,但你也來試試吧。詳細信息請參見this answer