【问题标题】:Compiling a basic OpenCV + Cuda program on linux在 linux 上编译一个基本的 OpenCV + Cuda 程序
【发布时间】:2011-10-14 02:33:33
【问题描述】:

我过去曾在 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   

【问题讨论】:

    标签: c++ c linux opencv cuda


    【解决方案1】:

    为了帮助您,我必须下载并安装 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_gpupkg-config 不包含该标志。

    【讨论】:

    • 非常感谢。添加 -lopencv_gpu 有效。最后我可以继续前进:D
    • @karlphillip 在命令行中添加 -lopencv_gpu 后出现以下错误 ---- /usr/bin/ld: cannot find -lopencv_gpu。你能建议这个问题的解决方案吗?
    • 这与在这个问题上所说的不同。随意点击 按钮并新建一个。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的快速回复。我现在试过了,但给出了完全相同的错误......如果我用 g++ 替换 nvcc 会给出同样的错误
    • @bjoernz :谢谢伙伴,它就像一个魅力 :) 上下文:这是一个用于 opencv gpu 样本的 make 命令。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2012-01-13
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多