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

C++ 编译一个基本的OpenCV+;linux上的Cuda程序,c++,c,linux,opencv,cuda,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/

我以前在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   

这看起来像是链接器问题。我不知道,
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
可以依赖于
libA
libB

中的符号,而不是在nvcc行中使用pkg config,我建议只手动将编译器指向opencv库并包含文件。也许您可以在命令行上运行pkg config--libs opencv,并将必要的libs复制到nvcc命令中。似乎nvcc只是被opencv库阻塞了(它不能确定它们!)。

为了帮助你,我不得不下载并安装CUDA 4.0(带驱动程序4.0.21),然后在Mac OS X 10.6.8上下载并编译我的Macbook Pro版的opencv 2.3

中的示例代码已通过以下方式在我的计算机上成功编译:

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

您缺少标志
-lopencv\u gpu
,该标志未包含在pkg config中。

感谢您的快速回复。我现在试过了,但还是出了同样的错误。。。如果我用g++@bjoernz:Thankz-mate替换nvcc,它也会出现同样的错误。它就像一个符咒一样工作:)上下文:这是opencv gpu示例的make命令。非常感谢。添加-lopencv_gpu工作正常。最后,我可以继续:D@karlphillip在将-lopencv\u gpu添加到命令行--/usr/bin/ld后,我遇到以下错误:找不到-lopencv\u gpu。你能提出这个问题的解决方案吗?这个问题与在这个问题上所说的不同。请随意点击“提问”按钮,并创建一个新的问题。