Caffe2填坑系列(9)----错误提示“undefined reference to caffe2::CUDAContext::“

一般出现”undefined reference to…“的错误是找不到相应的库造成的,但我自己在编写完一个Op后编译时出现了这个问题,经过一天的查找终于找到了根源所在,知道原因后自己都无语了,原来在caffe2中文件的命名是有规则了,不能胡乱起名。

我错将_op_gpu.cc,写成了_gpu_op.cc

首先,看一下在image/CMakeLists.txt中的设置

if(USE_OPENCV AND OpenCV_FOUND)#如果使用OpenCV,并且Opencv的路径找到
        message(STATUS "Including image processing operators")
  # ---[ GPU files
  # ------[ cuDNN
  file(GLOB tmp *_cudnn.cc)
  set(Caffe2_GPU_SRCS ${Caffe2_GPU_SRCS} ${tmp})
  # ------[ general GPU
  file(GLOB tmp *_gpu.cc)
  set(Caffe2_GPU_SRCS ${Caffe2_GPU_SRCS} ${tmp})
  # ------[ CUDA sources
  file(GLOB tmp *.cu)
  set(Caffe2_GPU_SRCS ${Caffe2_GPU_SRCS} ${tmp})
  # exclude test files
  file(GLOB tmp *_test.cc)
  exclude(Caffe2_GPU_SRCS "${Caffe2_GPU_SRCS}" ${tmp})

  # ---[ CPU files.
  file(GLOB tmp *.cc)
  set(Caffe2_CPU_SRCS ${Caffe2_CPU_SRCS} ${tmp})
  # exclude test files and gpu files
  file(GLOB tmp *_test.cc)
  exclude(Caffe2_CPU_SRCS "${Caffe2_CPU_SRCS}" ${tmp})
  exclude(Caffe2_CPU_SRCS "${Caffe2_CPU_SRCS}" ${Caffe2_GPU_SRCS})

  # ---[ GPU test files
  file(GLOB tmp *_gpu_test.cc)
  set(Caffe2_GPU_TEST_SRCS ${Caffe2_GPU_TEST_SRCS} ${tmp})

  # ---[ CPU test files
  file(GLOB tmp *_test.cc)
  set(Caffe2_CPU_TEST_SRCS ${Caffe2_CPU_TEST_SRCS} ${tmp})
  exclude(Caffe2_CPU_TEST_SRCS "${Caffe2_CPU_TEST_SRCS}" ${Caffe2_GPU_TEST_SRCS})

  # ---[ Send the lists to the parent scope.
  set(Caffe2_CPU_SRCS ${Caffe2_CPU_SRCS} PARENT_SCOPE)
  set(Caffe2_GPU_SRCS ${Caffe2_GPU_SRCS} PARENT_SCOPE)
  set(Caffe2_CPU_TEST_SRCS ${Caffe2_CPU_TEST_SRCS} PARENT_SCOPE)
  set(Caffe2_GPU_TEST_SRCS ${Caffe2_GPU_TEST_SRCS} PARENT_SCOPE)
else()
        message(STATUS "Excluding image processing operators due to no opencv")
endif()

从上面的代码我们可以看到,不同的后缀名代表了不同的文件,不同的文件会有不同的设置,我开始的命名格式为***_gpu_op.cc,编译时认为我的这个文件是一个CPU文件,对它的设置也按照CPU进行设置,但是我们文件内调用了CUDAContext,因此报了一个”undefined reference to caffe2::CUDAContext::“的错误。只要将gpu_op改成op_gpu,问题迎刃而解了。

起名不能瞎起!!!

你可能感兴趣的:(错题本,Caffe2)