unbuntu下編譯caffe出錯問題總結
在編譯caffe SSD過程中,由於嘗試anaconda進行caffe環境搭建,嘗試了過多方法,致使配置混亂,遂重新進行系統配置,並總結了可能會遇到的問題,記錄如下。
問題1及解決方案:
報錯:
.build_release/lib/libcaffe.so:
undefined reference to `google::protobuf::io::CodedOutputStream::WriteVarint64ToArray(unsigned long long, unsigned char)’*
(1)goole protoc 問題
一般是protoc版本問題,系統預設一般是3.1.0,在此降到2.6.1,具體方法,可參考上一篇
經常protoc不能make到,修改makefile中的protoc位置,具體操作如下:
# 也就是下面$(Q)後跟的地址,/usr/local/bin/protoc(whereis protoc找到自己安裝的位置)
$(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_BUILD_DIR)/%.pb.h : \
$(PROTO_SRC_DIR)/%.proto | $(PROTO_BUILD_DIR)
@ echo PROTOC $<
$(Q)/usr/local/bin/protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out= $(PROTO_BUILD_DIR) $<
$(PY_PROTO_BUILD_DIR)/%_pb2.py : $(PROTO_SRC_DIR)/%.proto \
$(PY_PROTO_INIT) | $(PY_PROTO_BUILD_DIR)
@ echo PROTOC \(python\) $<
$(Q)/usr/local/bin/protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<
(2)降gcc,g++的版本
(cuda版本不能超過6.0,故選擇降至4.8,這個具體問題具體分析)
參考部落格
gcc --version # 檢視當前版本
sudo apt-get install gcc-4.8
ls /usr/bin/gcc* # 檢視已有的gcc版本,確認一下剛才4.8.5有沒有裝成功
# 某個版本加入gcc候選中,最後的數字是優先順序,我自己是直接設為100,沒任何問題
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
sudo update-alternatives --config gcc # 顯示當前配置的gcc版本
# g++ 降級安裝同理,只需將gcc進行置換即可
# Note:此時gcc --version,可能還是顯示的以前預設版本,但配置已經更改為gcc-4.8了,如果出現這種情況也不必驚慌,為啥出現這種情況,我也很費解。
降完版本,如果問題仍未解決,可能是protobuf未用現有gcc/g++進行編譯,可重新進行編譯,編譯可見安裝protobuf 2.6.1,記得make之前make clean一下,防止出錯。
問題2:
File “/home/crj/caffe/python/caffe/init.py”, line 1, in
from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver
File “/home/crj/caffe/python/caffe/pycaffe.py”, line 13, in
from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver,
ImportError: /home/crj/caffe/python/caffe/_caffe.so: undefined symbol: _ZN5caffe9SGDSolverIfE19SnapshotSolverStateERKSs
解決方法:
# 分析原因:忘記實現make test,重新執行以下步驟可實現import caffe成功
make clean
make all -j16
make pycaffe
make test
make runtest
問題3:
出錯error:
NVCC src/caffe/test/test_im2col_kernel.cu
/usr/lib/gcc/x86_64-linux-gnu/6/include/stddef.h(436): error: identifier “nullptr” is undefined
/usr/lib/gcc/x86_64-linux-gnu/6/include/stddef.h(436): error: expected a “;”
/usr/include/x86_64-linux-gnu/c++/6/bits/c++config.h(205): error: expected a “;”
/usr/include/c++/6/exception(63): error: expected a “;”
/usr/include/c++/6/exception(69): error: expected a “;”
解決方法:
這個在網上查到的解決方案是gcc的版本問題,但是在caffe進行編譯前,已經將gcc降到了gcc-4.8版本,
本不應有此問題,故重新make clean編譯了一遍,成功。
問題4:
出錯error:
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
/usr/bin/x86_64-linux-gnu-ld: 找不到 -lopenblas
collect2: error: ld returned 1 exit status
Makefile:568: recipe for target ‘.build_release/lib/libcaffe.so.1.0.0-rc3’ failed
make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1
解決方法:
sudo apt-get install liblapack-dev liblapack3 libopenblas-base libopenblas-dev
問題5:
出錯error:
CXX/LD -o .build_release/tools/upgrade_net_proto_binary.bin
.build_release/lib/libcaffe.so:對‘boost::re_detail_106501::verify_options(unsigned int, boost::regex_constants::_match_flags)’未定義的引用
解決方法:
# 修改下面makefile檔案#中的內容
# LIBRARIES += glog gflags protobuf boost_system boost_filesystem boost_regex m hdf5_hl hdf5
LIBRARIES += glog gflags protobuf boost_system boost_filesystem boost_regex m hdf5_serial_hl hdf5_serial
問題6
這裡附一個在裝cuda時遇到的問題
sudo apt-get install cuda
出錯error:
依賴: cuda-9-0 (>= 9.0.176) 但是它將不會被安裝 無法修正錯誤,因為您要求某些軟體包保持現狀,它們破壞了軟體包間的依賴關係
這個問題,總結了一下,最可能出現的原因是,使用系統附加專有驅動引起的,網上一堆說是軟體更新的鍋,試了一下,均不好使,故放棄了專有驅動,自己重新進行安裝nvidia-390,解決了該問題。參考上篇部落格下的安裝GPU版本的tensorflow部分。
也總結下nvidia-smi命令後,顯示的驅動安裝失敗的問題。
(1)按上述步驟進行重新install nvidia-390
(2)在軟體和更新上的附加驅動中,選擇專有驅動nvidia-390
記得sudo reboot進行重啟,如果發現安裝成功,但是仍無效,你可能是忘記了重啟。
重啟過程中,藍屏介面選擇enroll mok ——continue——yes——密碼——reboot,注意(等待太久,藍屏介面自動過渡,同樣會不能成功)