2009-07-13 71 views
6

我正在使用OpenCV,我想將整個庫放在它自己的命名空間中。我環顧四周,但還沒有找到答案...你可以把一個庫放在命名空間裏面嗎?

你能做到這一點,而無需修改庫源代碼?如果那麼如何?

+0

我只看了OpenCV網站。它看起來像所有的功能前綴「cv」。儘管命名空間是一個更好的解決方案,但我想知道,您是否遇到實際的符號衝突? – 2009-07-14 03:29:11

+0

我沒有實際的碰撞,只是爲了讓事情組織起來,因爲我正在做一些openCV數據結構的包裝,並且希望將它們放在同一個名稱空間中。 – 2009-07-14 12:16:35

回答

7

基本沒有。你可以嘗試通過編寫包裝和宏來實現,但這不太可能。如果您確實需要這樣做,更好的方法是分叉庫並進行所需的名稱空間添加。當然,你真的需要這樣做來採取這種做法,我懷疑你不這樣做。

4

你原則上可以編寫一個程序來解析庫的符號導出表,並在那裏修改符號的名字。你仍然需要改變標題當然。

也就是說,編寫一個簡單的腳本來添加命名空間標籤並重新編譯庫會容易得多。

+8

我已經這樣做了一次,以解決第三方庫中醜陋的名稱衝突問題。我強烈的建議是:**不要**!這太糟糕了。 – 2009-07-13 18:03:20

2

您可以提供一個封裝頭文件,該文件在名稱空間內聲明相同的接口。在包裝源文件中,包含庫的標題並調用該庫。您的來源之外沒有任何來源需要了解圖書館的符號。如果你想要非常小心,你可以把它們放在一個動態加載的庫中。

這是很常見的做到這一點與COM來隱藏某些庫的鏈接器依賴項。看不出爲什麼你不能用C++來做到這一點。

3

一般的答案是,你不能,但有一些技巧你可以做。

例如,objcopy把的binutils具有通過使用--prefix符號標誌上的每個符號複製對象,但投入了前綴的能力。爲事物添加前綴往往是窮人的命名空間,是避免衝突的「好」方式。

用法很簡單,這樣的事情:

objcopy --prefix-symbols "__mylib_" object.o new_object.o 

注:是,它的工作與.so文件來了。

注意2:這將完全破壞C++名稱的變形,因此只能在具有C風格API的庫上嘗試此操作。既然你說的是在沒有名字空間的情況下添加一個名字空間,我認爲是這種情況。

相關問題