【问题标题】:compiling opencv using namespace alias使用命名空间别名编译opencv
【发布时间】:2017-03-21 01:45:21
【问题描述】:

我们需要将 opencv 库完全合并到我们的自定义库中。

(我们可以通过使用 bcp 使用命名空间别名来实现提升,例如:dist/bin/bcp --namespace=customboost --namespace-alias module-list

在类似的行中,我们是否有一种简单的方法可以将 opencv 完全包装到自定义命名空间中?

我们想要这样做是因为 opencv 是一个静态链接到我们面向客户的自定义库中的实现细节(同样是静态的)。我们不希望从自定义库中导出的 cv 符号与全局空间发生冲突。

【问题讨论】:

标签: c++ opencv ubuntu cmake static-libraries


【解决方案1】:

命名空间别名的另一种方法是获取 OpenCV 源代码,并将任何出现的 cv(命名空间)替换为新的自定义命名空间名称。

使用正则表达式,您将替换:

([^a-zA-Z0-9_])cv([^a-zA-Z0-9_])

与:

$1myCv$2

解释:cv,前面和后面是任何不在集合a-zA-Z0-9_ 中的字符。匹配表达式中的括号以及替换表达式中的$1$2 用于将前后字符放回原位。

例子:

#ifdef HAVE_OPENCL

namespace cv
{
namespace ocl
{
${nested_namespace_start}

")

cv::try
cv_wontsubstitute

变成:

#ifdef HAVE_OPENCL

namespace myCv
{
namespace ocl
{
${nested_namespace_start}

")

myCv::try
cv_wontsubstitute

另一个更疯狂的想法可能是编译你的库和定义宏的opencv

#define cv myCv

让预处理器重命名 OpenCV 命名空间。实际上,您将使用-D cv=myCv 调用编译器

【讨论】:

  • 谢谢@Antonio,我终于用 sed 做了一些非常相似的事情。受 boost bcp 实用程序的启发,我最终也提供了命名空间别名。
【解决方案2】:

与 boost bcp 不同,OpenCV 不提供任何本机实用程序。但这是一个相当简单的任务,可以使用正则表达式来完成。

这行得通,现在我已经使用 mycustomcv 命名空间编译了 OpenCV 版本

find . -type f -name '*.cpp' -o -name '*.hpp' -o -name '*.h' -o -name '*.cmake'  -o -name '*.py'| xargs sed -i '/using/! s/\<namespace cv\>/namespace mycustomcv{} namespace cv = mycustomcv; namespace mycustomcv/g'

运行脚本后,命名空间从namespace cv {...}变为

namespace mycustomcv{} namespace cv = mycustomcv; namespace mycustomcv 
{ 
  //whatever
}

同时跳过 using namespace cv; 声明。

例如,名称重整符号如下所示,

_ZZN8mycustomcv25getMorphologyColumnFilterEiiii // namespace mycustomcv 

_ZZN8cv25getMorphologyColumnFilterEiiii  // namespace cv

【讨论】:

  • 绝妙的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多