• (原)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更新结束

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

  • 相关阅读:
    swing之jtable的详细介绍
    JSplitPane类测试实例
    在桌面应用中使用JAVA DB[组图]
    java线程池主线程等待子线程执行完成后再继续处理后面工作
    Cannot load 64bit SWT libraries on 32bit JVM 解决方法
    Cannot load 64bit SWT libraries on 32bit JVM
    java程序的皮肤效果实现代码
    Java设置窗口大化时大小
    Java Swing 组件全演示
    Java 线程池详解
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/6950263.html
Copyright © 2020-2023  润新知