在ubuntu中用cuda编译opencv的makefile停止工作

Posted

技术标签:

【中文标题】在ubuntu中用cuda编译opencv的makefile停止工作【英文标题】:makefile to compile opencv with cuda in ubuntu stopped working 【发布时间】:2012-08-09 08:52:18 【问题描述】:

我正在尝试在我的笔记本电脑上编译一个项目,其中我需要 CUDA 和 opencv。 所以我创建了 3 个文件

main.cpp

kernel.cu

kernel.h

在 main.cpp 我有 opencv 代码,在 kernel.cu 我有我的内核。 我正在使用我在另一个项目中找到的这个 makefile:

CXX=g++
CUDA_INSTALL_PATH=/usr/local/cuda
CFLAGS= -I. -I$(CUDA_INSTALL_PATH)/include `pkg-config --cflags opencv`
LDFLAGS= -L$(CUDA_INSTALL_PATH)/lib64 -lcudart `pkg-config --libs opencv`

all:
    $(CXX) $(CFLAGS) -c main.cpp -o main.o
    nvcc $(CUDAFLAGS) -arch="sm_21" -c kernel.cu -o kernel.o
    $(CXX) $(LDFLAGS) main.o kernel.o -o main

我曾在另一台使用 opencv 2.4.2、CUDA 4.0 和 gcc 4.4 的计算机上尝试过相同的项目,它运行良好,但现在我在笔记本电脑上使用 opencv 2.4.2、CUDA 4.2 和 gcc 4.6 进行尝试,它不断返回最后一行的错误,但它确实创建了 main.o 和 kernel.o,如果我注释掉最后一行,它不会给出错误。

我已经构建并运行了 opencv 和 cuda sdk 示例,它们分别运行良好。 你能帮帮我吗?

这是它返回的内容:

g++ -L/usr/local/cuda/lib64 -lcudart pkg-config --libs opencvmain.o kernel_gpu.o -o grayscale

main.o:在函数“main”中:

main.cpp:(.text+0x44): undefined reference to `cv::imread(std::basic_string, std::allocator > const&, int)'

main.cpp:(.text+0x72): 对 `cv::_InputArray::_InputArray(cv::Mat const&)' 的未定义引用

main.cpp:(.text+0xa6): 未定义引用 `cv::imshow(std::basic_string, std::allocator > const&, cv::_InputArray const&)'

main.cpp:(.text+0xc8): undefined reference to `cv::waitKey(int)'

main.o:在函数`cv::Mat::~Mat()'中:

main.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): 对 `cv::fastFree(void*)' 的未定义引用

main.o:在函数`cv::Mat::release()'中:

main.cpp:(.text._ZN2cv3Mat7releaseEv[cv::Mat::release()]+0x47): 对`cv::Mat::deallocate()'的未定义引用

kernel_gpu.o:在函数cuda_BGsub': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x41): undefined reference tocudaConfigureCall'

kernel_gpu.o:在函数cuda_grayscale': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0xb3): undefined reference tocudaConfigureCall'中

kernel_gpu.o:在函数cuda_Filter': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x10d): undefined reference tocudaConfigureCall'

kernel_gpu.o:在函数cuda_Noise_reduc': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x176): undefined reference tocudaConfigureCall'中

kernel_gpu.o:在函数cuda_RGB': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x1d9): undefined reference tocudaConfigureCall'中

kernel_gpu.o:tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x234):更多未定义的“cudaConfigureCall”引用如下

kernel_gpu.o:在函数`__cudaUnregisterBinaryUtil()'中:

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x409): 对 `__cudaUnregisterFatBinary' 的未定义引用

kernel_gpu.o:在函数`__device_stub__Z5BGsubPhS_S_iib(unsigned char*, unsigned char*, unsigned char*, int, int, bool)'中:

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x442): 对“cudaSetupArgument”的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x465): 对“cudaSetupArgument”的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x488): 对“cudaSetupArgument”的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x4a7): 对“cudaSetupArgument”的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x4c6): 对“cudaSetupArgument”的未定义引用

kernel_gpu.o:tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x4e5):更多未定义的“cudaSetupArgument”引用跟随

kernel_gpu.o:在函数`sti__cudaRegisterAll_45_tmpxft_000016bc_00000000_4_kernel_gpu_cpp1_ii_cdcbb70e()'中:

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0xe7e): 对 `__cudaRegisterFatBinary' 的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0xedc): 对 `__cudaRegisterFunction' 的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0xf29): 对 `__cudaRegisterFunction' 的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0xf76): 对 `__cudaRegisterFunction' 的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0xfc3): 对 `__cudaRegisterFunction' 的未定义引用

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x1010): 对 `__cudaRegisterFunction' 的未定义引用

kernel_gpu.o:tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x105d):更多未定义的 `__cudaRegisterFunction' 参考

kernel_gpu.o:在函数`cudaError cudaLaunch(char*)'中:

tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text.Z10cudaLaunchIcE9cudaErrorPT[cudaError cudaLaunch(char*)]+0x14): 未定义对“cudaLaunch”的引用

collect2: ld 返回 1 个退出状态

make: * [all] 错误 1

编辑: 此版本有效:

CXX=g++
CUDA_INSTALL_PATH=/usr/local/cuda
CFLAGS= -I. -I$(CUDA_INSTALL_PATH)/include `pkg-config --cflags opencv`
LDFLAGS= -L$(CUDA_INSTALL_PATH)/lib64 -lcudart `pkg-config --libs opencv`

all:
    $(CXX) $(CFLAGS) -c main.cpp -o main.o
    nvcc $(CUDAFLAGS) -arch="sm_21" -c kernel.cu -o kernel.o
    $(CXX)  main.o `pkg-config --libs opencv` -L$(CUDA_INSTALL_PATH)/lib64 -lcudart kernel.o -o main

【问题讨论】:

【参考方案1】:

您可以尝试将所有 -l 选项放在 kernel.o 后面吗?

最好的问候!

【讨论】:

谢谢!有效。我在问题的末尾添加了有效的。

以上是关于在ubuntu中用cuda编译opencv的makefile停止工作的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu20.04系统+cuda10.1+opencv4.1.0+dense_flow的编译与安装,吐血总结!!!

Ubuntu16.04+cuda8.0rc+opencv3.1.0+caffe+Theano+torch7搭建教程

opencv+cuda 编译

ubuntu16.04+opencv2.4.13+cuda 8.0+python

opencv4.2+opencv_contrib编译gpu加速带cuda和CUDnn(二)

opencv4.2+opencv_contrib编译upg加速带cuda和CUDnn(一)