4

我正在尝试编译一个同时使用 CUDA 和 OpenCV 的程序。我确信 OpenCV 的路径是正确的,因为用这个编译一个简单的 OpenCV 程序:

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 编译时我遗漏了什么或做错了什么?

4

3 回答 3

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

如果这不起作用,请删除-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

曾几何时,当我们拥有 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
于 2013-05-12T23:41:58.153 回答
1

可能-L像第一个一样在第二个库文件之前丢失?

于 2013-05-12T03:28:36.160 回答
1

我只是能够通过在我的代码中添加一个 pragma 指令来链接到 Windows 上的 cuBLAS:

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

这也可能适用于 OpenCV。但是请注意,这是不可移植的。

于 2013-05-14T16:56:01.310 回答