Почему OpenCV не компилируется в NVCC? - PullRequest
2 голосов
/ 04 декабря 2009

Я пытаюсь интегрировать 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 (float)" функция "абс (двойной)" функция "абс (длинный)" функция "abs (int)" Типы аргументов: (ptrdiff_t)

Таким образом, мой вопрос заключается в том, почему используется различие, связанное с тем же компилятором (должно быть), и, во-вторых, как я могу это исправить.

Ответы [ 5 ]

2 голосов
/ 05 декабря 2009

В общем, я бы рекомендовал сохранять разделение между кодом хоста и кодом CUDA, используя только nvcc для ядер и "оболочек" хоста. Это особенно легко с Visual Studio, создайте свой проект как обычно (например, консольное приложение), а затем внедрите свое приложение в файлы .cpp. Если вы хотите запустить функцию CUDA, создайте ядро ​​и оболочку в одном или нескольких файлах .cu. Файл Cuda.rules, поставляемый с SDK, автоматически позволяет VS компилировать файлы .cu и связывать результат с остальными файлами .cpp.

1 голос
/ 18 октября 2011

Существует проект, размещенный на 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 и скомпилировать их.

1 голос
/ 11 декабря 2009

Скомпилируйте код .cu как библиотеку и затем свяжите его с основной программой. Я предлагаю использовать cmake, так как он делает процесс легким

1 голос
/ 07 декабря 2009

NVCC передает код C ++ хост-компилятору, но сначала он должен проанализировать и понять код. К сожалению, у NVCC проблемы с STL. Если это вообще возможно, разделите код, который использует STL, на файлы .cpp и скомпилируйте их с Visual Studio (без предварительной передачи их через NVCC).

0 голосов
/ 19 апреля 2010

Так что нет простого способа использовать nvcc для компиляции вашего текущего кода на C ++, вы должны писать обертки и компилировать их с помощью nvcc, в то время как вы компилируете оставшуюся часть кода с помощью g ++ или что-то еще?

...