使用命名空间别名编译 OpenCV

compiling opencv using namespace alias

本文关键字:编译 OpenCV 别名 命名空间      更新时间:2023-10-16

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

(我们可以通过使用 bcp 使用命名空间别名来使用 Boost 来做到这一点,例如:dist/bin/bcp --namespace=customboost --namespace-alias module-list (

同样,我们是否有一种简单的方法将opencv完全包装到自定义命名空间中?

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

命名空间

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

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

([^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调用编译器

与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