caffe编译时出现undefined reference错误的原因与解决办法

时间:2021-11-17 04:56:17

在make caffe项目的时候,可能会在最后的CXX/LD部分遇到libcaffe.so的链接过程出现undefined reference错误。此类错误出现的原因可能是.so文件进行链接时,其中的符号在链接路径中无法找到。链接路径包括:

  1. makefile规定的路径
  2. 系统lib路径,/usr/lib64等
  3. LD_LIBRARRY_PATH规定的路径

对于编译caffe而言,因路径设置的问题而导致的错误较少见。较常见的问题是.so等待链接的符号没有定义。可能存在的原因有(包含但不限于):

  1. 依赖库没有安装正确,如opencv, protobuf等。此类情况下编译错误信息也多与这些库的接口相关,可以使用命令 ‘cmake ./’ 来进行依赖项完整性的检查;
  2. 定义了函数但是没有实现。常见情况有:

    • 在头文件中定义了Forward_gpu()函数,但是源文件中只有Forward_cpu()实现版本,没有gpu的实现。此时应将Forward_gpu()的声明删去。
    • 如果错误信息包含了一个类的所有函数接口,但是这些函数都已经实现了,可能是因为类的一些泛型没有实例化。例如,如果有报错(cmake信息):
../lib/libcaffe.so.1.0.0: undefined reference to `caffe::BlockingQueue<boost::shared_ptr<caffe::DataReader::QueuePair> >::size() const'
../lib/libcaffe.so.1.0.0: undefined reference to `caffe::BlockingQueue<boost::shared_ptr<caffe::DataReader::QueuePair> >::push(boost::shared_ptr<caffe::DataReader::QueuePair> const&)'
../lib/libcaffe.so.1.0.0: undefined reference to `caffe::BlockingQueue<caffe::Datum*>::push(caffe::Datum* const&)'
../lib/libcaffe.so.1.0.0: undefined reference to `caffe::BlockingQueue<caffe::Datum*>::BlockingQueue()'
../lib/libcaffe.so.1.0.0: undefined reference to `caffe::BlockingQueue<boost::shared_ptr<caffe::DataReader::QueuePair> >::pop(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
../lib/libcaffe.so.1.0.0: undefined reference to `caffe::BlockingQueue<caffe::Datum*>::pop(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
../lib/libcaffe.so.1.0.0: undefined reference to `caffe::BlockingQueue<caffe::Datum*>::try_pop(caffe::Datum**)'
../lib/libcaffe.so.1.0.0: undefined reference to `caffe::BlockingQueue<boost::shared_ptr<caffe::DataReader::QueuePair> >::BlockingQueue()'

则应该在blocking_queue.cpp中添加一些泛型的声明,使这种数据类型的泛型实例化:

template class BlockingQueue<Datum*>;
template class BlockingQueue<shared_ptr<DataReader::QueuePair> >;