2013-03-16 1 views
4

Я пытаюсь скомпилировать программу, которая использует как CUDA, так и OpenCV. Я уверен, что пути к OpenCV прав, потому что составление простой программы OpenCV с этим:Ошибка соединения OpenCV 2.4 + Командная строка Windows 7 (x64) CUDA

cl /I"%OPENCV_DIR%\include" /LINK"%OPENCV_DIR%\x64\vc10\lib\opencv_core240.lib" "%OPENCV_DIR%\x64\vc10\lib\opencv_highgui240.lib" testCV.cpp

успешно компилирует программу. Теперь, когда я пытаюсь скомпилировать с NVCC так:

nvcc testCuda.cu --cl-version 2010 --use-local-env -I"%OPENCV_DIR%\include" -L"%OPENCV_DIR%\x64\vc10\lib\opencv_core240.lib" "%OPENCV_DIR%\x64\vc10\lib\opencv_highgui240.lib"

Я получил сообщение об ошибке при попытке ссылку, которая говорит:

error LNK2019: unresolved external symbol cvLoadImage referenced in function main a.exe : fatal error LNK1120: 1 unresolved externals

Что я отсутствующий или делаю неправильно при компиляции с NVCC?

+0

У вас есть идеи? Я действительно не знаю и не могу понять, почему это происходит. – BRabbit27

+0

Любая идея? Все еще ищут, чтобы это работало! – BRabbit27

+0

Очевидно, 'cvLoadImage' действительно находится в' opencv_highgui240.lib' (по крайней мере, он находится в 'libopencv_highgui.so' на Linux). Кроме того, '-L' используется для указания путей поиска библиотек (например,' "% OPENCV_DIR% \ x64 \ vc10 \ lib" 'в вашем случае), тогда как вам нужно использовать' -l' для указания библиотек, которые будут использоваться в (без расширения файла библиотеки, например 'opencv_highgui240'). Если вам не нужна компиляция CLI, вы также можете следовать инструкциям [здесь] (http://stackoverflow.com/questions/10831088/using-opencv-2-4-0-in-a-visual-studio-2010 -проект/10838338 # 10838338). – BenC

ответ

3

-L используются для указания библиотеки каталоги, а не файлов.

Вы, вероятно, хотите выполнить:

nvcc testCuda.cu --cl-version 2010 --use-local-env -I"%OPENCV_DIR%\include" -L"%OPENCV_DIR%\x64\vc10\lib" -lopencv_core240 -lopencv_highgui240 

Если doens't работа, падение -l и добавлять свои расширения:

nvcc testCuda.cu --cl-version 2010 --use-local-env -I"%OPENCV_DIR%\include" -L"%OPENCV_DIR%\x64\vc10\lib" opencv_core240.lib opencv_highgui240.lib 

Once upon a time, когда мы были CUDA 2.x и OpenCV 2.1, я написал файл Makefile для компиляции приложения, которое использовало обе основы:

CXX=g++ 

CUDA_INSTALL_PATH=/usr/local/cuda 
CFLAGS= -I. -I$(CUDA_INSTALL_PATH)/include -I/usr/include/opencv 
LDFLAGS= -L$(CUDA_INSTALL_PATH)/lib -lcudart -L/usr/lib -lcxcore -lcv -lhighgui -lcvaux -lml 

ifdef EMU 
CUDAFLAGS+=-deviceemu 
endif 

all: 
    $(CXX) $(CFLAGS) -c main.cpp -o main.o -m32 -arch i386 
    nvcc $(CUDAFLAGS) -c kernel_gpu.cu -o kernel_gpu.o 
    $(CXX) $(LDFLAGS) main.o kernel_gpu.o -o grayscale -arch i386 

clean: 
    rm -f *.o grayscale 
+0

Не могли бы вы рассказать, в чем цель '--cl-version 2010' и' --use-local'. Я так старался, но все же он дал мне ошибку, что 'nvcc fatal: Не удается найти компилятор cl.exe в PATH'. Итак, я использую '-ccbin 'C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ cl.exe". Он решил проблему, связанную с поиском пути, но теперь она дает мне ошибку 'nvcc fatal: Option '--cl-version' необходимо указать с опцией '--use-local''. – skm

1

Может быть, отсутствует -L перед вторым файлом библиотеки, как первый?

1

Я был просто в состоянии связать с cuBLAS на Windows, добавив директиву ргадта в мой код:

#pragma comment(lib,"cublas.lib") 

Это может работать с OpenCV, а также. Помните, что это non-portable.