7

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

你可以在不修改库源代码的情况下做到这一点吗?如果那怎么办?

4

4 回答 4

7

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

于 2009-07-13T18:01:42.960 回答
4

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

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

于 2009-07-13T18:01:03.540 回答
4

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

例如,来自binutils的objcopy能够复制对象,但使用--prefix-symbols标志为每个符号添加前缀。给事物添加前缀通常是穷人的命名空间,是一种避免冲突的“好”方式。

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

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

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

注意 2:这将完全破坏 c++ 名称修改,因此只能在具有 C 样式 API 的库上尝试此操作。由于您正在谈论在没有名称空间的情况下添加名称空间,因此我认为是这种情况。

于 2009-07-13T19:53:26.793 回答
2

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

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

于 2009-07-13T18:50:30.553 回答