Caffe构建给出GCC链接错误“在创建共享库时无法使用。;使用-fPIC重新编译”

时间:2018-07-15 00:15:20

标签: gcc cmake g++ caffe

我正在尝试使用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,但是请收集一下我应该在gcc命令中添加-fPIC的地方。但是,我不知道应该在哪里进行此更改,或者我是否应该在Cmake中的某个地方告诉我可以正确地构造gcc命令。

如何强制带有-fPIC选项的CMake创建/使用gcc命令,还是我应该完全做些其他事情?

1 个答案:

答案 0 :(得分:2)

错误不是来自CMake,而是来自链接器。它实际上表明:

您不能使用PIC(位置独立代码)功能构建共享库 libcaffe.so ,并将其与静态库 libleveldb.a编译而没有此功能。

可能的解决方案是:

  1. 获取静态库的共享版本(在您的情况下为libleveldb.a),因此将使用PIC进行编译。这就是错误消息提示您的内容。
  2. 代替构建共享库(在您的情况下为Caffe),构建静态库,而无需使用PIC。请注意,在这种情况下,尝试在将来的共享库中使用结果库时,您将面临类似的问题。

    对于大多数CMake项目,可以使用以下命令强制构建静态库:

    cmake -DBUILD_SHARED_LIBS=OFF <other parameters>
    

严格来说,PIC功能与库的类型(共享或静态)无关。因此,您可能有一个带有 PIC的静态库,或者没有它的共享库。

对于许多CMake项目,您可以通过以下方式控制所创建库的PIC功能:

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