我正在尝试在笔记本电脑上编译一个项目,我需要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 opencv
main.o kernel_gpu.o -o grayscalemain.o:在函数`main'中:
main.cpp :(。text + 0x44):未定义引用`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):对`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 to
cudaConfigureCall'kernel_gpu.o:在函数
中cuda_grayscale': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0xb3): undefined reference to
cudaConfigureCall'kernel_gpu.o:在函数
中cuda_Filter': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x10d): undefined reference to
cudaConfigureCall'kernel_gpu.o:在函数
中cuda_Noise_reduc': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x176): undefined reference to
cudaConfigureCall'kernel_gpu.o:在函数
中cuda_RGB': tmpxft_000016bc_00000000-1_kernel_gpu.cudafe1.cpp:(.text+0x1d9): undefined reference to
cudaConfigureCall'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 :(文本 Z10cudaLaunchIcE9cudaErrorPT [cudaError cudaLaunch(字符*)] + 0×14):未定义参考`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
答案 0 :(得分:1)
你能尝试将所有-l选项放在kernel.o后面吗?
祝你好运!