【问题标题】:cuda opencv undefined reference to `nppiConvert_16u8u_C4R`cuda opencv 未定义对“nppiConvert_16u8u_C4R”的引用
【发布时间】:2016-10-18 14:33:03
【问题描述】:

我正在尝试运行基于 opencv 的简单 rgb 到灰度脚本并通过 cuda 运行它。执行计算的 C++ 脚本的标头链接来自 opencv 的以下 api:

#include <opencv2/core/core.hpp>                                                
#include <opencv2/highgui/highgui.hpp>                                          
#include <opencv2/imgproc/imgproc.hpp> 

我正在尝试使用以下makefile 逻辑对其进行编译:

OPENCV_LIBPATH=-L/apps/gcc/4.7.2/opencv/2.4.8/lib 
OPENCV_LIBPATH += -l/opt/cuda/5.5/lib64

OPENCV_INCLUDEPATH=/apps/gcc/4.7.2/opencv/2.4.8/include                         
OPENCV_LIBS=-lopencv_core -lopencv_imgproc -lopencv_highgui -lnppi -lz                   
CUDA_INCLUDEPATH=/opt/cuda/5.5/include                                          

NVCC_OPTS=-O3 -arch=sm_20 -Xcompiler -Wall -Xcompiler -Wextra -m64              

GCC_OPTS=-O3 -Wall -Wextra -m64                                                 

main: rgbtogrey.o rgb_to_grey.o Makefile                                     
    $(NVCC) -o main.out rgbtogrey.o rgb_to_grey.o -I$(OPENCV_INCLUDEPATH) $(OPENCV_LIBPATH) $(OPENCV_LIBS)

rgbtogrey.o: rgbtogrey.cpp timer.h utils.h                                      
    g++ -c rgbtogrey.cpp $(GCC_OPTS) -I $(CUDA_INCLUDEPATH) -I $(OPENCV_INCLUDEPATH)

rgb_to_grey.o: rgb_to_grey.cu utils.h                                           
    nvcc -c rgb_to_grey.cu $(NVCC_OPTS)                                         

clean:                                                                          
    rm -f *.o hw   

我尝试了许多其他解决方案,例如 Compiling a basic opencv cudaLinking Cuda in C++ issue

当前错误:

/apps/gcc/4.7.2/opencv/2.4.8/lib/libopencv_highgui.a(grfmt_exr.cpp.o): In function `cv::ExrDecoder::ExrDecoder()':
grfmt_exr.cpp:(.text._ZN2cv10ExrDecoderC2Ev+0x9d): undefined reference to `Imf::Chromaticities::Chromaticities(Imath::Vec2<float> const&, Imath::Vec2<float> const&, Imath::Vec2<float> const&, Imath::Vec2<float> const&)'

我对此很陌生,因此不确定在哪里寻找解决此错误的方法。

编辑: 1.在添加LIB路径后,我在main中添加了lnppi选项(请参阅更新的makefile部分)

现在出错:

/apps/gcc/4.7.2/opencv/2.4.8/lib/libopencv_core.a(persistence.cpp.o): In function `icvGets(CvFileStorage
persistence.cpp:(.text._ZL7icvGetsP13CvFileStoragePci+0x127): undefined reference to `gzgets'
  1. 通过lz添加到zlib的链接

【问题讨论】:

  • 为了访问 NPPI 函数,您需要链接到 NPPI 库。我在你的 makefile 中没有看到。
  • 对于gzgets,你需要链接zlib
  • 感谢 lz 添加。但仍然出现错误
  • 似乎您正在链接到静态版本的 opencv。在这种情况下,您还必须链接 opencv 的所有依赖项,例如libIlmImf, libjpeg, libpng, libtiff, zlib
  • 谢谢...链接这些解决了问题!

标签: c++ opencv cuda npp


【解决方案1】:

尝试通过-libIlmImf -llibjpeg -llibjasper -llibpng -lzlib 使用OpenCV 的OPENCV_PATH/3rdparty/lib 文件夹下的附加库。 还要注意链接库的顺序,因为任何静态库都必须以适当的顺序链接,否则 GNU ld 将出现未解析的引用:

如果任何 [静态] 库 A 依赖于 库 B 中定义的符号, 那么 library A 应该首先出现在提供给链接器的列表中。

更多信息请参见linker order - GCC

【讨论】:

  • 谢谢!...我通过将库 acc 添加到 @sgarizvi 的 cmets 来解决它。感谢你的回答。你能把 libIlmImf 添加到你的 ans 中吗?对于遇到此问题的任何其他人,我想接受这一点。
  • 感谢您的回答。就我而言,我尝试在 android 上使用 OpenCV。所以我输入了LOCAL_STATIC_LIBRARIES += libjpeg libpng libtiff libjasper IlmImf opencv_highgui opencv_core opencv_improc。然后我得到了一长串编译器错误。 highgui 移到第 3 方库之前后,(LOCAL_STATIC_LIBRARIES += opencv_highgui libjpeg libpng libtiff libjasper IlmImf opencv_core opencv_improc) 编译器错误消失了。
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 2016-04-02
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多