CUDA と opencv の両方が必要なラップトップでプロジェクトをコンパイルしようとしています。だから私は3つのファイルを作成しました
main.cpp
kernel.cu
カーネル.h
main.cpp には opencv コードがあり、kernel.cu にはカーネルがあります。別のプロジェクトで見つけたこのメイクファイルを使用しています。
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 グレースケールmain.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:(. text.Z10cudaLaunchIcE9cudaErrorPT [cudaError cudaLaunch(char*)]+0x14): 「cudaLaunch」への未定義の参照
collect2: ld が 1 つの終了ステータスを返しました
make: * [すべて] エラー 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