天天看點

caffe編譯時出現undefined reference錯誤的原因與解決辦法

在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> >;