轉載請註明出處:html
http://www.cnblogs.com/darkknightzh/p/6950263.htmlpython
自從使用anaconda後,方即是方便了,也遇到了不少蛋疼的問題。linux
此次使用anaconda自帶的g++編譯cpp成so庫,供python調用(之前使用ubuntu自帶的g++時,正常)。此次輸入下面編譯命令(說明:使用的代碼在另外一臺電腦上是成功編譯的,可是在目前使用的這臺電腦上就逗比了。。。):c++
g++ -std=c++11 -shared -fPIC -o libXXX.so XXX.cpp
以後,會提示下面的錯誤:ubuntu
/usr/bin/ld: /home/XXX/anaconda2/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.4.0/crtbeginS.o:unrecognized relocation(0x2a) in section `.text' /usr/bin/ld: final link failed: Bad value collect2: error: ld returned 1 exit status
找了半天,發現解決方式是,直接使用系統自帶的g++,而非anaconda中的g++。ui
若是直接輸入g++ -v,顯示的是anaconda裏面的路徑。若是輸入g++-4.9,(前提是電腦安裝了4.9版本的g++,不然看一下是什麼版本,輸入對應的版本號。能夠在/usr/bin文件夾內找到對應的gcc和g++)則顯示usr/lib/gcc下面的路徑。於是,終端中輸入:spa
g++-4.9 -std=c++11 -shared -fPIC -o libXXX.so XXX.cpp
成功的編譯出so庫來了。。。蛋疼.net
後來看了一下以前能成功編譯so庫的電腦,雖然那臺電腦也安裝了anaconda,可是g++和gcc都是usr/lib/gcc目錄下的。出問題的電腦,不清楚怎麼設置的,g++和gcc默認的變成了anaconda裏面的了。。。哎code
=============================================================================================htm
170620更新:
上面是直接在終端中輸入的,若是使用cmake的話,稍微麻煩一點(在編譯opencv時,因爲電腦上裝了anaconda,於是默認總使用anaconda的C++,而後就提示上面的問題)。
使用cmake的話,可使用CMAKE_C_COMPILER及CMAKE_CXX_COMPILER這兩個來設定使用的c及c++編譯器(http://blog.csdn.net/10km/article/details/50444715),以下(代碼不全,具體參考 http://www.cnblogs.com/darkknightzh/p/5638117.html):
cmake -D CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++-4.9 -D CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc-4.9
使用上述命令後,編譯opencv成功了。折騰人啊。。。
170620更新結束
180320更新:
今天在使用anaconda並編譯caffe時,出現crtbeginS.o:unrecognized relocation的錯誤。解決方法吐下:
1. 修改makefile文件
直接在Makefile最開始增長下面一句話:
CXX := /usr/bin/g++-4.9
以後在終端中直接使用官方的編譯命令便可:
make CUDA_HOME=/usr/local/cuda-8.0
方法2:輸入make時增長CXX標誌位
http://www.javashuo.com/article/p-bhbczjgj-du.html中指出:
= 是最基本的賦值
:= 是覆蓋以前的值
?= 是若是沒有被賦值過就賦予等號後面的值
+= 是添加等號後面的值
於是考慮直接添加CXX的標誌,以下:
make CXX=/usr/bin/g++-4.9 CUDA_HOME=/usr/local/cuda-8.0
弱弱的說一下,終端中輸入下面的命令,也能夠:
make CXX?=/usr/bin/g++-4.9 CUDA_HOME=/usr/local/cuda-8.0
若是要使用nccl,如http://www.javashuo.com/article/p-ktiqyvgq-dm.html中所說,須要Makefile.config中取消註釋USE_NCCL := 1,並將NCCL的include和lib路徑增長到Makefile.config中,具體以下:
USE_NCCL := 1 INCLUDE_DIRS += /path/nccl/build/include LIBRARY_DIRS += /path/nccl/build/lib
但若是使用的是anaconda,可能會提示找不到某個庫。。。後來決定不使用nccl了,於是沒有繼續深刻查找緣由。見諒。
安裝nccl及可能碰到的問題見:
http://www.cnblogs.com/darkknightzh/p/5717234.html
http://www.cnblogs.com/darkknightzh/p/6950263.html
180320更新結束
=============================================================================================