我正在尝试将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)
所以我的问题是为什么考虑使用相同的编译器(应该是)的差异,其次是如何解决这个问题。
答案 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 ++或者你有什么来编译其余的代码?