你能把一个库放在命名空间里面吗?

时间:2009-07-13 17:56:53

标签: c++ opencv namespaces

我正在使用OpenCV,我想将整个库放在它自己的命名空间中。我环顾四周但没找到答案......

您可以在不修改库源代码的情况下执行此操作吗?如果那么怎么样?

4 个答案:

答案 0 :(得分:7)

基本上没有。您可以尝试通过编写包装器和宏来完成它,但它不太可能工作。如果您确实需要这样做,更好的方法是分叉库并添加所需的命名空间。当然,你真的需要这样做才能采取这种方法,我怀疑你没有。

答案 1 :(得分:4)

原则上你可以编写一个程序来解析库的符号导出表,并改变那里符号的名称。你当然还需要改变标题。

这就是说编写一个简单的脚本来添加命名空间标签并重新编译库要容易得多。

答案 2 :(得分:4)

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

例如, binutils 中的 objcopy 可以复制对象,但是使用 - prefix-symbols <在每个符号上添加前缀/ strong>旗帜。为事物添加前缀通常是穷人的命名空间,并且是避免冲突的“好”方式。

用法非常简单,如下所示:

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

注意:是的,它也适用于.so文件。

注意2:这将彻底破坏c ++名称修改,因此只能在具有C风格API的库上尝试此操作。既然你在谈论添加一个没有命名空间的命名空间,我认为就是这种情况。

答案 3 :(得分:2)

您可以提供一个包装器头文件,在命名空间内声明相同的接口。在包装器源文件中,包含库的标头并调用该库。源外的任何来源都不需要知道库的符号。如果你想要非常小心,你可以将它们放在一个动态加载的库中。

通过COM执行此操作以隐藏某些库的链接器依赖关系是很常见的。无法理解为什么你不能用C ++做到这一点。