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

时间:2011-07-27 09:36:56

标签: c++ c linux opencv cuda

我过去曾在linux上使用opencv,但没有使用cuda。几个月来,我一直在努力解决以下编译错误。在尝试了许多解决方案后,我放弃了并使用了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   

3 个答案:

答案 0 :(得分:9)

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

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

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

您错过了标记-lopencv_gpu pkg-config 未包含该标记。

答案 1 :(得分:1)

这看起来像链接器问题。我不知道,如果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的符号。

答案 2 :(得分:1)

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