(原)ubuntnu中anaconda的g++提示crtbeginS.o:unrecognized relocation

轉載請註明出處: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_COMPILERCMAKE_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更新結束

=============================================================================================

相關文章
相關標籤/搜索