我们需要将opencv库完全合并到我们的自定义库中。
(我们可以通过使用bcp来使用命名空间别名来提升,例如:dist / bin / bcp --namespace = customboost --namespace-alias module-list )
在类似的路线上,我们是否有一种简单的方法可以将opencv完全包装到自定义命名空间中?
我们希望这样做,因为opencv是一个静态链接的实现细节到我们面向客户的自定义lib(再次是静态)。我们不希望从自定义lib导出的cv符号与全局空间冲突。
答案 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