无法在Windows上构建NVIDIA VisionWorks(OpenVX)

时间:2016-07-10 23:10:45

标签: build nvidia

我正在尝试在Windows上安装VisionWorks,如名为" VisionWorks 1.0 for Windows README"的链接中所述。在本页面: https://developer.nvidia.com/embedded/visionworks

根据README文档,VisionWorks与Windows兼容,具有以下配置:

OS       : Windows 8 x64
OpenCV   : public OpenCV 2.4.12
CUDA     : NVIDIA CUDA 7.0

我正在使用与README中描述的以下变量完全相同的配置(使用我的特定PC路径):

[CUDA_VERSION]            : 7.0
[CUDA_INSTALL_DIR]        : C:\cuda\v7
[OpenCV_INSTALL_DIR]      : C:\opencv
[OpenCV_VERSION]          : 2412
[VisionWorks_VERSION]     : 1.0
[VisionWorks_INSTALL_DIR] : C:\cuda\VisionWorks
[SAMPLES_BUILD_DIR]       : C:\cuda\VisionWorks\SAMPLES_BUILD_DIR

我按照README中的说明进行操作,如下所示(帖子末尾的图片):

第1步: 将样本从[VisionWorks_INSTALL_DIR] \ share \ visionworks \ sources复制到a 具有写访问权限的目录[SAMPLES_BUILD_DIR]。

第2步:     打开Visual Studio的开发人员命令提示符 - VS2013 x64本机工具
    命令提示符。

第3步:         转到[SAMPLES_BUILD_DIR]:

    > cd [SAMPLES_BUILD_DIR]

第4步:
        编辑config.nmake文件以插入所有先决条件的正确路径         安装目录信息。

    # Dependency locations
    CUDA_DIR = [CUDA_INSTALL_DIR]
    OPENCV_DIR = [OpenCV_INSTALL_DIR]\build
    OpenCV_VERSION = [OpenCV_VERSION]
    VISIONWORKS_DIR = [VisionWorks_INSTALL_DIR]

    # Debug build?
    dbg = 0

第5步:         使用nmake构建样本

    > nmake

但是当我执行nmake命令时,我收到以下错误:

C:\cuda\VisionWorks\SAMPLES_BUILD_DIR> nmake
  

Microsoft(R)程序维护实用程序版本12.00.21005.1   版权所有(C)Microsoft Corporation。保留所有权利。

     

cd nvxio&& " C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ BIN \ amd64 \ nmake.exe" / / nologo build   如果不存在" obj \ release" mkdir" obj \ release"           cl / EHsc / O2 / MD / nologo" -DVISIONWORKS_DIR = \" C:/ cuda / VisionWorks \"" -D USE_GUI = 1 -DUSE_GLFW = 1   -I./include -I./shaders -I ../ 3rdparty / opengl -I ../ 3rdparty / freetype / include -I ../ 3rdparty / glfw3 / include -I./src   -DUSE_OPENCV = 1 -I" C:\ c uda \ v7 \ include" -I" C:\ opencv \ include" -I" C:\ cuda \ VisionWorks \ include" -I" .. \ 3 rdparty \ eigen"   / FO"物镜\释放\" / c src \ Application.cpp src \ ArgumentParser.cpp   src \ ConfigParser.cpp src \ OptionHandler.cpp src \ Utility.cpp   Application.cpp   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(109)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(118)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(127)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(136)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明ArgumentParser.cpp   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(109)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(118)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(127)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(136)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明ConfigParser.cpp   ./include\NVXIO/OptionHandler.hpp(109):错误C2783:' nvxio ::范围   nvxio :: ra nges :: all(void)' :无法推断模板参数   ' T'           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   ./include\NVXIO/OptionHandler.hpp(118):错误C2783:' nvxio ::范围   nvxio :: ra nges :: all(void)' :无法推断模板参数   ' T'           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   ./include\NVXIO/OptionHandler.hpp(127):错误C2783:' nvxio ::范围   nvxio :: ra nges :: all(void)' :无法推断模板参数   ' T'           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   ./include\NVXIO/OptionHandler.hpp(136):错误C2783:' nvxio ::范围   nvxio :: ra nges :: all(void)' :无法推断模板参数   ' T'           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明OptionHandler.cpp   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(109)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(118)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(127)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明   C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ OptionHandler.hpp(136)   :错误C2783:' nvxio ::范围nvxio :: ranges :: all(void)' : 不能   为T' T'推断tertlate论证           C:\ CUDA \ visionworks \ samples_build_dir \ nvxio \包括\ nvxio \ Range.hpp(163)   :见'nvxio :: ranges :: all'的声明Utility.cpp生成   代码... NMAKE:致命错误U1077:'" C:\ Program Files(x86)\ Microsoft   Visual Studio 12.0 \ VC \ BIN \ amd64 \ cl.EXE"' :返回代码' 0x2' 停止。    NMAKE:致命错误U1077 :' cd' :返回代码' 0x2' 停止。

     

C:\ CUDA \ VisionWorks \ SAMPLES_BUILD_DIR>

Images showing the steps I performed

我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题是VS 2013编译器中存在一个错误(更多功能缺少实现)。函数模板参数仅根据参数中的类型推导出来,因此不带参数的调用不会触发推理。

VisionWorks相当丑陋的解决方法是替换Range.hpp中的模板

/*
 * \ingroup group_nvxio_range
 * \brief Creates a range that includes all points.
 * \return The range.
 */
template <typename T>
inline Range<T> all() {
    return { std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max(), true, true };
}

使用带有伪参数的模板,并相应地修复OptionHandler.hpp中的用法。

/*
 * \ingroup group_nvxio_range
 * \brief Creates a range that includes all points.
 * \return The range.
 */
template <typename T>
inline Range<T> all(T dummy) {
    return { std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max(), true, true };
}

以便OptionHandler.hpp中的调用看起来像

static ptr real(float *result, const Range<float> &validRange = ranges::all<float>((float)1));

因此,这使得代码非常难看,并且在某种程度上打败了模板的目的。这个模板问题在VS 2015中得到修复,但CUDA在2015年没有编译,这使得OpenVX的更高级使用毫无意义。