回答
基本沒有。你可以嘗試通過編寫包裝和宏來實現,但這不太可能。如果您確實需要這樣做,更好的方法是分叉庫並進行所需的名稱空間添加。當然,你真的需要這樣做來採取這種做法,我懷疑你不這樣做。
你原則上可以編寫一個程序來解析庫的符號導出表,並在那裏修改符號的名字。你仍然需要改變標題當然。
也就是說,編寫一個簡單的腳本來添加命名空間標籤並重新編譯庫會容易得多。
我已經這樣做了一次,以解決第三方庫中醜陋的名稱衝突問題。我強烈的建議是:**不要**!這太糟糕了。 – 2009-07-13 18:03:20
您可以提供一個封裝頭文件,該文件在名稱空間內聲明相同的接口。在包裝源文件中,包含庫的標題並調用該庫。您的來源之外沒有任何來源需要了解圖書館的符號。如果你想要非常小心,你可以把它們放在一個動態加載的庫中。
這是很常見的做到這一點與COM來隱藏某些庫的鏈接器依賴項。看不出爲什麼你不能用C++來做到這一點。
一般的答案是,你不能,但有一些技巧你可以做。
例如,objcopy把從的binutils具有通過使用--prefix符號標誌上的每個符號複製對象,但投入了前綴的能力。爲事物添加前綴往往是窮人的命名空間,是避免衝突的「好」方式。
用法很簡單,這樣的事情:
objcopy --prefix-symbols "__mylib_" object.o new_object.o
注:是,它的工作與.so文件來了。
注意2:這將完全破壞C++名稱的變形,因此只能在具有C風格API的庫上嘗試此操作。既然你說的是在沒有名字空間的情況下添加一個名字空間,我認爲是這種情況。
- 1. 把 放在空的裏面好嗎?
- 2. SQL Reporting - 你可以在一個組裏面有一個組嗎?
- 3. 裏面的命名空間
- 4. 你可以把太多的信息放入一個變量嗎?
- 5. 我可以把HTML放在一個Symfony窗體按鈕裏面嗎?
- 6. 我們可以把哈希表放在哈希表裏面嗎?
- 7. 使用PHP,我可以把變量放在變量裏面嗎?
- 8. C#你可以在web服務裏面放置一個timercallback
- 9. CSS僞類可以命名空間嗎?
- 10. 你把ivysettings.xml放在哪裏?
- 11. 把一個UIButton放在UITableView裏面
- 12. 你把數據庫字段名稱放在哪裏?
- 13. 你把你的JavaScript放在哪裏?
- 14. 我可以把表單登錄頁面html放在一個webapp的庫中嗎?
- 15. 把類命名空間內
- 16. 液體 - 你可以有一把鑰匙,裏面還有另一把鑰匙。
- 17. 我可以在PhalconPHP中使用多個命名空間嗎?
- 18. 你可以在一個here-doc裏放一個條件語句嗎?
- 19. 我可以命名一個以數字開頭的C#名稱空間嗎?
- 20. 你可以把一個jQuery函數的輸出放入一個變量中嗎?
- 21. 你可以把一個Canvas實例放入一個jQuery畫廊嗎?
- 22. 在C#中,你可以把一個Or放在「where」接口約束中嗎?
- 23. 你可以直接在命名空間中使用函數參數嗎?
- 24. 你把你的Rack中間件文件放在哪裏?
- 25. 你能轉發 - 在C++中聲明一個命名空間別名嗎?
- 26. 你可以把網絡方法放在一個NSManagedObject子類中嗎?
- 27. SQL你可以把一個if語句放在select過程中嗎?
- 28. PHP:你可以把一個DateTime對象放在while循環中嗎?
- 29. 我可以在一個文件中加載整個命名空間嗎?
- 30. 你可以把基本的命令行java程序放在雲上嗎?
我只看了OpenCV網站。它看起來像所有的功能前綴「cv」。儘管命名空間是一個更好的解決方案,但我想知道,您是否遇到實際的符號衝突? – 2009-07-14 03:29:11
我沒有實際的碰撞,只是爲了讓事情組織起來,因爲我正在做一些openCV數據結構的包裝,並且希望將它們放在同一個名稱空間中。 – 2009-07-14 12:16:35