使用命名空间别名

时间:2017-03-21 01:45:21

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

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

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

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

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

2 个答案:

答案 0 :(得分: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

调用编译器

答案 1 :(得分:1)

与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