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


轉載請注明出處:

http://www.cnblogs.com/darkknightzh/p/6950263.html

自從使用anaconda后,方便是方便了,也遇到了很多蛋疼的問題。

這次使用anaconda自帶的g++編譯cpp成so庫,供python調用(以前使用ubuntu自帶的g++時,正常)。這次輸入下面編譯命令(說明:使用的代碼在另一台電腦上是成功編譯的,但是在目前使用的這台電腦上就逗比了。。。):

g++ -std=c++11 -shared -fPIC -o libXXX.so XXX.cpp

之后,會提示下面的錯誤:

    /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++。

如果直接輸入g++ -v,顯示的是anaconda里面的路徑。如果輸入g++-4.9,(前提是電腦安裝了4.9版本的g++,否則看一下是什么版本,輸入對應的版本號。可以在/usr/bin文件夾內找到對應的gcc和g++)則顯示usr/lib/gcc下面的路徑。因而,終端中輸入:

g++-4.9 -std=c++11 -shared -fPIC -o libXXX.so XXX.cpp

成功的編譯出so庫來了。。。蛋疼

后來看了一下之前能成功編譯so庫的電腦,雖然那台電腦也安裝了anaconda,但是g++和gcc都是usr/lib/gcc目錄下的。出問題的電腦,不清楚怎么設置的,g++和gcc默認的變成了anaconda里面的了。。。哎

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

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標志位

https://www.cnblogs.com/sky-heaven/p/6272408.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,如https://www.cnblogs.com/haiyang21/p/7183413.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更新結束

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM