在Linux上编译一个基本的OpenCV + Cuda程序

我曾经在linux上使用过opencv,但是没有使用cuda。 我已经努力了几个月的以下编译错误。 在尝试了许多解决scheme后,我放弃了使用windows。 不过,我真的想在Linux上工作。 这是我用来编译opencv_gpu网站上给出的阈值示例的命令。

nvcc `pkg-config --libs opencv` -L. -L/usr/local/cuda/lib -lcuda -lcudart `pkg-config --cflags opencv` -I. -I/usr/local/cuda/include threshold.cpp -o threshold 

这里是错误的:

 /tmp/tmpxft_0000171b_00000000-1_threshold.o: In function `main': threshold.cpp:(.text+0x124): undefined reference to `cv::gpu::Stream::Null()' threshold.cpp:(.text+0x156): undefined reference to `cv::gpu::threshold(cv::gpu::GpuMat const&, cv::gpu::GpuMat&, double, double, int, cv::gpu::Stream&)' threshold.cpp:(.text+0x16d): undefined reference to `cv::gpu::GpuMat::download(cv::Mat&) const' /tmp/tmpxft_0000171b_00000000-1_threshold.o: In function `cv::gpu::GpuMat::GpuMat(cv::Mat const&)': threshold.cpp:(.text._ZN2cv3gpu6GpuMatC1ERKNS_3MatE[cv::gpu::GpuMat::GpuMat(cv::Mat const&)]+0x63): undefined reference to `cv::gpu::GpuMat::upload(cv::Mat const&)' /tmp/tmpxft_0000171b_00000000-1_threshold.o: In function `cv::gpu::GpuMat::~GpuMat()': threshold.cpp:(.text._ZN2cv3gpu6GpuMatD1Ev[cv::gpu::GpuMat::~GpuMat()]+0xd): undefined reference to `cv::gpu::GpuMat::release()' collect2: ld returned 1 exit status make: *** [all] Error 1 

为了帮助您,我必须下载并安装CUDA 4.0 (带驱动程序4.0.21),然后在Mac OS X 10.6.8上为我的Macbook Pro下载和编译OpenCV 2.3

来自OpenCV_GPU的示例代码通过以下方式在我的机器上成功编译:

 g++ threshold.cpp -o threshold `pkg-config --cflags --libs opencv` -lopencv_gpu 

您错过了标记-lopencv_gpu ,它不包含在pkg-config中

这看起来像一个链接器问题。 我不知道,如果nvcc遵循与gcc相同的约定,但我会尝试:

nvcc`pkg-config –cflags opencv` -L。 -L / usr / local / cuda / lib -I。 -I / usr / local / cuda / include -o threshold threshold.cpp`pkg-config –libs opencv` -lcuda -lcudart

更一般的:如果你写

gcc t.cpp -lB -lA

这意味着libB依赖于来自libA符号; t.cpp可以依赖于来自libAlibB符号。

而不是在nvcc行中使用pkg-config,我建议手动将编译器指向opencv库并包含文件。 也许你可以在命令行上运行pkg-config –libs opencv并将必要的库复制到你的nvcc命令中。 看来nvcc只是在opencv库上窒息(它无法确定!)。