ubuntu16.04 CUDA 8.0 caffe錯誤
阿新 • • 發佈:2019-01-04
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,成功編譯,祝好運