C++ 可以在名称空间中放置库吗?

C++ 可以在名称空间中放置库吗?,c++,opencv,namespaces,C++,Opencv,Namespaces,我正在使用OpenCV,我想将整个库放在它自己的名称空间中。我环顾了很多地方,但没有找到答案 您可以在不修改库源代码的情况下执行此操作吗?如果是,那么怎么做?原则上,您可以编写一个程序来解析库的符号导出表,并在那里更改符号的名称。当然,您仍然需要更改标题 也就是说,编写一个简单的脚本来添加名称空间标记并重新编译库会容易得多。基本上不会。您可以尝试通过编写包装器和宏来实现这一点,但这不太可能奏效。如果确实需要这样做,更好的方法是分叉库并添加所需的名称空间。当然,您确实需要这样做才能采用这种方法,我

我正在使用OpenCV,我想将整个库放在它自己的名称空间中。我环顾了很多地方,但没有找到答案


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

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


也就是说,编写一个简单的脚本来添加名称空间标记并重新编译库会容易得多。

基本上不会。您可以尝试通过编写包装器和宏来实现这一点,但这不太可能奏效。如果确实需要这样做,更好的方法是分叉库并添加所需的名称空间。当然,您确实需要这样做才能采用这种方法,我怀疑您不需要这样做。

您可以提供一个包装头文件,在名称空间中声明相同的接口。在包装器源文件中,包括库的头并调用该库。源代码之外的任何源代码都不需要知道库的符号。如果您想非常小心,可以将所有这些都放在动态加载的库中


使用COM来隐藏某些库的链接器依赖项是非常常见的。不明白为什么不能用C++来做。

< p>一般的答案是你不能,但是你可以做一些技巧。< /P> 例如,来自binutilsobjcopy可以复制对象,但可以使用--前缀符号标志在每个符号上添加前缀。在事物前面加前缀通常是穷人的名称空间,是避免冲突的一种“ok”方式

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

objcopy --prefix-symbols "__mylib_" object.o new_object.o
注意:是的,它也适用于.so文件


<强>注2:这将完全打破C++名称的限制,所以只在C风格的API库上尝试这个。既然您正在谈论添加一个没有名称空间的名称空间,我假设情况就是这样。

我曾经这样做过,以解决第三方库中丑陋的名称冲突。我的强烈建议是:不要!这太可怕了。或者你可以使用objcopy,它可以改变符号:-P.@Evan,你仍然需要弄清楚它们是如何在你的电脑上被弄坏的system@bdonlan:没错。。。如果它们被弄坏了。如果我们谈论的是C风格的API,那么不用担心;)。不幸的是,OP在这方面没有具体说明。当然,最明智的建议是什么?我只是查看了OpenCV网站。看起来所有函数的前缀都是“cv”。虽然名称空间是一个更好的解决方案,但我想知道,您是否有实际的符号冲突?我没有实际的冲突,只是为了在编写一些openCV数据结构的包装时保持组织,并希望将它们放在同一名称空间中。