代码之家  ›  专栏  ›  技术社区  ›  user1245262

caffe build给出gcc链接错误“在生成共享对象时无法使用;用-fpic重新编译”

  •  0
  • user1245262  · 技术社区  · 6 年前

    我试着用cmake安装caffe,但是当我运行 make all (运行后 cmake .. 从一个 build 目录)出现以下错误:

    me@gimli:~/Downloads/caffe/build$ make all
    [  1%] Built target caffeproto
    [  1%] Linking CXX shared library ../../lib/libcaffe.so
    /usr/bin/x86_64-linux-gnu-ld: /usr/local/lib/libleveldb.a(db_impl.cc.o): relocation R_X86_64_PC32 against symbol `_ZN7leveldb10EnvWrapper8ScheduleEPFvPvES1_' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/x86_64-linux-gnu-ld: final link failed: Bad value
    collect2: error: ld returned 1 exit status
    src/caffe/CMakeFiles/caffe.dir/build.make:40060: recipe for target 'lib/libcaffe.so.1.0.0' failed
    make[2]: *** [lib/libcaffe.so.1.0.0] Error 1
    CMakeFiles/Makefile2:267: recipe for target 'src/caffe/CMakeFiles/caffe.dir/all' failed
    make[1]: *** [src/caffe/CMakeFiles/caffe.dir/all] Error 2
    Makefile:129: recipe for target 'all' failed
    make: *** [all] Error 2
    

    我不太了解cmake,但我应该在某个地方将-fpic添加到gcc命令中。但是,我不知道应该在哪里进行更改,或者cmake中是否存在应该告诉它正确构造gcc命令的地方。

    我怎样才能强迫cmake创建/使用带有-fpic选项的gcc命令,或者我完全应该做些别的事情?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tsyvarev    6 年前

    错误不是来自cmake而是来自 链接器 是的。它实际上告诉我们:

    你不能建造 共享库 libcaffe.so 具有 图片( 位置无关代码 )特征并将其与 静态库 libleveldb.a 编译的 没有 这个功能。

    可能的解决方案是:

    1. 得到 静态库的共享版本 ( libleveldb.a版 在您的情况下),所以它将与pic一起编译。这就是错误信息所暗示的。
    2. 相反 建筑物 共享库 (在你的案例中是caffe) 建立静态的 ,不使用pic。注意,在这种情况下,当您试图在将来的共享库中使用结果库时,将面临类似的问题。

      对于大多数强制构建静态库的cmake项目,可以使用:

      cmake -DBUILD_SHARED_LIBS=OFF <other parameters>
      

    严格地说,pic特性独立于库的类型(共享或静态)。所以你可以 静态库 pic,或构建 共享库没有 它。

    对于许多cmake项目,您可以使用

    cmake -DPOSITION_INDEPENDENT_CODE=<ON|OFF> <other parameter>