我正在使用 OpenCV,我想将整个库放在它自己的命名空间中。我环顾四周,但没有找到答案......
你可以在不修改库源代码的情况下做到这一点吗?如果那怎么办?
我正在使用 OpenCV,我想将整个库放在它自己的命名空间中。我环顾四周,但没有找到答案......
你可以在不修改库源代码的情况下做到这一点吗?如果那怎么办?
基本上没有。您可以尝试通过编写包装器和宏来做到这一点,但这不太可能奏效。如果您确实需要这样做,更好的方法是分叉库并添加所需的命名空间。当然,你真的需要这样做才能采用这种方法,我怀疑你不需要。
原则上,您可以编写一个程序来解析库的符号导出表,并在那里更改符号的名称。当然,您仍然需要更改标题。
也就是说,编写一个简单的脚本来添加命名空间标签并重新编译库会容易得多。
一般的答案是你不能,但你可以做一些技巧。
例如,来自binutils的objcopy能够复制对象,但使用--prefix-symbols标志为每个符号添加前缀。给事物添加前缀通常是穷人的命名空间,是一种避免冲突的“好”方式。
用法非常简单,如下所示:
objcopy --prefix-symbols "__mylib_" object.o new_object.o
注意:是的,它也适用于 .so 文件。
注意 2:这将完全破坏 c++ 名称修改,因此只能在具有 C 样式 API 的库上尝试此操作。由于您正在谈论在没有名称空间的情况下添加名称空间,因此我认为是这种情况。
您可以提供一个包装头文件,该文件在命名空间内声明相同的接口。在您的包装源文件中,包含库的标头并调用该库。您的来源之外的任何来源都不需要了解库的符号。如果您想非常小心,可以将所有内容放在动态加载的库中。
使用 COM 来隐藏某些库的链接器依赖项是很常见的。不明白为什么你不能用 C++ 做到这一点。