1. 程式人生 > >ubuntu16.04 CUDA 8.0 caffe錯誤

ubuntu16.04 CUDA 8.0 caffe錯誤

1.引言

  這篇文章主要記錄自己在安裝caffe時,遇到的兩個比較坑爹的錯誤,caffe的具體安裝和配置過程,這裡不詳細介紹,網上有很多部落格介紹.

2.  遇到兩個錯誤

  • 第一個錯誤:
對‘google::base::CheckOpMessageBuilder::NewString()’未定義的引用
對‘google::base::CheckOpMessageBuilder::NewString()’未定義的引用
compute_image_mean.cpp:(.text.startup+0x13f):對‘google::SetUsageMessage(std::string const&)’未定義的引用
compute_image_mean.cpp:(.text.startup+0x247):對‘google::protobuf::MessageLite::ParseFromString(std::string const&)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::io::CodedOutputStream::WriteStringWithSizeToArray(std::string const&, unsigned char*)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::string*)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::Message::GetTypeName() const’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::internal::StringTypeHandlerBase::Delete(std::string*)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::MessageFactory::InternalRegisterGeneratedFile(char const*, void (*)(std::string const&))’未定義的引用
../lib/libcaffe.so.1.0.0:對‘leveldb::DB::Open(leveldb::Options const&, std::string const&, leveldb::DB**)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::Message::DebugString() const’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(int, std::string const&, google::protobuf::io::CodedOutputStream*)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::internal::StringTypeHandlerBase::New()’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::internal::empty_string_’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::internal::NameOfEnum(google::protobuf::EnumDescriptor const*, int)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::internal::WireFormatLite::WriteString(int, std::string const&, google::protobuf::io::CodedOutputStream*)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘leveldb::Status::ToString() const’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::DescriptorPool::FindFileByName(std::string const&) const’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::string*)’未定義的引用
../lib/libcaffe.so.1.0.0:對‘google::protobuf::Message::InitializationErrorString() const’未定義的引用

乍一看,我以為時protobuf和levedb這兩個軟體沒有安裝成功,於是乎卸了這兩個軟體,然後手動安裝,各種自己瞎配,折騰了大半天還是沒有成功,快要放棄的時候,有人說可能時gcc的版本問題, 當時我的gcc的版本是4.8,導致了這種編譯的不成功,換成5.0就行了,具體操作如下:
  • 首先,去/usr/bin 目錄下找到gcc 右鍵屬性,看它的軟連線指向何處,如果軟鏈指的不是gcc5.0,刪除它, 同樣的方式檢視g++
  • sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc
    sudo ln -s /usr/bin/g++-5 /usr/bin/g++
    sudo ldconfig

    右鍵檢視二者的屬性是否軟連結正確
  • 由於CUDA是需要5.0版本以下的版本編譯, 所以我們需要修改 /usr/local/cuda/include/host_config.h
    #error -- unsupported GNU version! gcc versions later than 5 are not supported!
    //改為
    //#error -- unsupported GNU version! gcc versions later than 5 are not supported!

    以上操作需要root許可權
  • 繼續編譯caffe

第二個問題:

local/caffe/test/test.testbin: anaconda2/lib/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required bylocal/caffe/test/test.testbin)
local/caffe/test/test.testbin: anaconda2/lib/libstdc++.so.6
: version `GLIBCXX_3.4.21' not found (required by local/caffe/test/test.testbin) /local/caffe/test/test.testbin: anaconda2/lib/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /local/caffe/lib/libcaffe.so.1.0.0)
起初遇到這個問題,他們告訴我gcc的版本要5.0以下,於是乎,又是各種瞎操作,有了問題一的出現,問題一解決了,兜兜轉轉又回到解放前,其實不是gcc的版本不對,從錯誤提示可以看出,anconda裡面的gcc和系統裡面的gcc衝突了,但是我不能把anaconda幹掉,因為我很多框架環境是基於這個的,解決方法如下:
  • 首先確認 anaconda2/lib/libstdc++.so.6是否真的沒有GLIBCXX_3.4.21
    strings anaconda2/lib/libstdc++.so.6 | grep GLIBC 
    
  • 紅色部分,換成你的路徑,確認之後發現確實沒有
  • 確認系統目錄下的libstdc++.so.6是否有GLIBCXX_3.4.21
    string /usr/lib/libstdc++.so.6 |grep GLIBC

    如果顯示/usr/lib/libstdc++.so.6不存在,使用以下命令查詢
    locate libstdc++.so.6
    

    會出來一堆路徑,我的是在/usr/lib32目錄下,然後將它拷貝到/usr/lib 目錄下
    sudo /usr/lib32/libstdc++.so.6 /usr/lib
    sudo ldconfig


  • 拷貝完之後,
    strings /usr/lib/libstdc++.so.6 | grep GLIBC 
    GLIBCXX_3.4
    GLIBCXX_3.4.1
    GLIBCXX_3.4.2
    GLIBCXX_3.4.3
    GLIBCXX_3.4.4
    GLIBCXX_3.4.5
    GLIBCXX_3.4.6
    GLIBCXX_3.4.7
    GLIBCXX_3.4.8
    GLIBCXX_3.4.9
    GLIBCXX_3.4.10
    GLIBCXX_3.4.11
    GLIBCXX_3.4.12
    GLIBCXX_3.4.13
    GLIBCXX_3.4.14
    GLIBCXX_3.4.15
    GLIBCXX_3.4.16
    GLIBCXX_3.4.17
    GLIBCXX_3.4.18
    GLIBCXX_3.4.19
    GLIBCXX_3.4.20
    GLIBCXX_3.4.21

    我清楚的看到,系統裡面的gcc有我需要的版本,然後編譯caffe,但衝突並沒有解決,
  • 接下來,先到目錄下拷貝一份libstdc++.so.6,備份,以防萬一,然後刪除libstdc++.so.6, 把/usr/bin/libstdc++.so.6軟連線過來
  • sudo ln -s /usr/lib/libstdc++.so.6 anaconda2/lib/libstdc++.so.6
  • 繼續編譯caffe,成功編譯,祝好運