【问题标题】:Can you put a library inside a namespace?您可以将库放在名称空间中吗?
【发布时间】:2010-11-10 09:36:13
【问题描述】:

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

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

【问题讨论】:

  • 我刚刚看了 OpenCV 网站。看起来所有函数都以“cv”为前缀。虽然命名空间是一个更好的解决方案,但我想知道,您是否有实际的符号冲突?
  • 我没有遇到实际的冲突,只是为了让事情井井有条,因为我正在包装一些 openCV 数据结构并希望将它们放在同一个命名空间中。

标签: c++ opencv namespaces


【解决方案1】:

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

【讨论】:

  • 当然还有最明智的建议?
【解决方案2】:

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

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

【讨论】:

  • 我曾经这样做是为了解决第三方库中丑陋的名称冲突。我强烈的建议是:不要!太可怕了。
  • 或者你可以只使用能够改变符号的 objcopy :-P.
  • @Evan,你仍然需要弄清楚它们是如何在你的系统上被破坏的
  • @bdonlan: true ... 如果 它们完全被破坏了。如果我们谈论的是 C 风格的 API,那就不用担心 ;)。不幸的是,OP 在这方面没有具体说明。
【解决方案3】:

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

例如,binutils 中的 objcopy 可以复制对象,但使用 --prefix-symbols 标志。给事物添加前缀通常是穷人的命名空间,是一种避免冲突的“好”方式。

用法很简单,大概是这样:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 2011-03-03
      • 2011-03-03
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多