为什么OpenCV不能在NVCC中编译?

时间:2009-12-04 15:15:59

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

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

我得到的错误是什么?

c:\ opencv2.0 \ include \ opencv \ cxoperations.hpp(1137):错误:没有运算符“=”匹配这些操作数             操作数类型是:const cv :: Range = cv :: Range

c:\ opencv2.0 \ include \ opencv \ cxoperations.hpp(2469):错误:重载函数“std :: abs”的多个实例与参数列表匹配:             功能“abs(long double)”             功能“abs(浮动)”             功能“abs(double)”             功能“abs(长)”             功能“abs(int)”             参数类型是:(ptrdiff_t)

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

5 个答案:

答案 0 :(得分:2)

一般情况下,我建议保持主机代码和CUDA代码之间的分离,只使用nvcc作为内核和主机“包装器”。使用Visual Studio特别容易,正常创建项目(例如控制台应用程序),然后在.cpp文件中实现应用程序。如果要运行CUDA函数,请在一个或多个.cu文件中创建内核和包装器。随SDK提供的Cuda.rules文件将自动启用VS来编译.cu文件并将结果与​​其余的.cpp文件链接。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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代码分开并进行编译。

答案 4 :(得分:0)

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