【问题标题】:Why won't OpenCV compile in NVCC?为什么 OpenCV 不能在 NVCC 中编译?
【发布时间】:2010-12-23 06:52:43
【问题描述】:

我正在尝试将 CUDA 和 openCV 集成到一个项目中。问题是使用 NVCC 时 openCV 无法编译,而普通的 c++ 项目编译得很好。这对我来说似乎很奇怪,因为我认为 NVCC 将所有主机代码传递给 c/c++ 编译器,在本例中是 Visual Studio 编译器。

我得到的错误是什么?

c:\opencv2.0\include\opencv\cxoperations.hpp(1137): error: no operator "=" 匹配这些操作数 操作数类型为: const cv::Range = cv::Range

c:\opencv2.0\include\opencv\cxoperations.hpp(2469):错误:多个重载函数“std::abs”实例与参数列表匹配: 函数“abs(长双)” 函数“abs(float)” 函数“绝对(双)” 函数“绝对(长)” 函数“绝对(整数)” 参数类型是:(ptrdiff_t)

所以我的问题是为什么使用相同编译器(应该)的差异,其次是我如何解决这个问题。

【问题讨论】:

标签: c++ visual-studio compiler-construction opencv cuda


【解决方案1】:

一般而言,我建议将主机代码和 CUDA 代码分开,仅将 nvcc 用于内核和主机“包装器”。这在 Visual Studio 中特别容易,像平常一样创建您的项目(例如控制台应用程序),然后在 .cpp 文件中实现您的应用程序。当您想要运行 CUDA 函数时,请在一个或多个 .cu 文件中创建内核和包装器。 SDK 提供的 Cuda.rules 文件将自动启用 VS 编译 .cu 文件并将结果与​​其余 .cpp 文件链接。

【讨论】:

    【解决方案2】:

    NVCC 将 C++ 代码传递给主机编译器,但它必须首先解析和理解代码。不幸的是,NVCC 在 STL 方面遇到了麻烦。如果可能的话,将使用 STL 的代码分离到 .cpp 文件中,并使用 Visual Studio 编译这些文件(不首先通过 NVCC 传递它们)。

    【讨论】:

      【解决方案3】:

      将 .cu 代码编译为库,然后将其链接到主程序。我建议使用 cmake,因为它使过程变得轻而易举

      【讨论】:

        【解决方案4】:

        cuda-grayscale 托管了一个项目,展示了如何将 OpenCV + CUDA 集成在一起。如果您下载源代码,请检查 Makefile:

        g++ $(CFLAGS) -c main.cpp -o Debug/main.o
        nvcc $(CUDAFLAGS) -c kernel_gpu.cu -o Debug/kernel_gpu.o
        g++ $(LDFLAGS) Debug/main.o Debug/kernel_gpu.o -o Debug/grayscale
        

        这是一个非常简单的项目,演示了如何将常规 C++ 代码(OpenCV 和其他东西)从 CUDA 代码中分离出来并进行编译。

        【讨论】:

          【解决方案5】:

          所以没有简单的方法使用 nvcc 来编译你当前的 C++ 代码,你必须编写包装器并使用 nvcc 编译它们,而你使用 g++ 或你有什么来编译其余代码?

          【讨论】:

            猜你喜欢
            • 2017-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-05
            • 2016-03-20
            • 2015-04-30
            • 2011-10-15
            相关资源
            最近更新 更多