转载请注明出处: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更新结束
=============================================================================================