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

Caffe构建给出GCC链接错误“;无法在创建共享对象时使用。;使用-fPIC“重新编译”;,gcc,cmake,g++,caffe,Gcc,Cmake,G++,Caffe,我正在尝试使用CMake安装caffe,但当我运行make all(从build目录运行CMake..后)时,我收到以下错误: 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.

我正在尝试使用CMake安装caffe,但当我运行
make all
(从
build
目录运行
CMake..
后)时,我收到以下错误:

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命令,或者我还应该做其他事情?

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

您无法使用PIC(位置独立代码)功能构建共享库
libcaffe.so
,并将其与静态库链接
libleveldb.a
编译,而不使用该功能

可能的解决办法是:

  • 获取静态库的共享版本(
    libleveldb.a
    )。这就是错误消息给您的建议

  • 而不是构建共享库的(在您的案例中是Caffe),构建静态库的,而不使用PIC。请注意,在这种情况下,在将来的共享库中尝试使用结果库时,您将面临类似的问题

    对于大多数CMake项目,强制构建静态库可以通过以下方式执行:

     cmake -DBUILD_SHARED_LIBS=OFF <other parameters>
    
    cmake-DBUILD\u SHARED\u LIBS=OFF
    

  • 严格来说,PIC特性独立于库的类型(共享或静态)。因此,您可能有一个带有PIC的静态库,或者构建一个没有PIC的共享库

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

    cmake -DPOSITION_INDEPENDENT_CODE=<ON|OFF> <other parameter>
    
    cmake-DPOSITION\u独立\u代码=
    
    错误不是来自CMake,而是来自链接器。它实际上告诉我们:

    您无法使用PIC(位置独立代码)功能构建共享库
    libcaffe.so
    ,并将其与静态库链接
    libleveldb.a
    编译,而不使用该功能

    可能的解决办法是:

  • 获取静态库的共享版本(
    libleveldb.a
    )。这就是错误消息给您的建议

  • 而不是构建共享库的(在您的案例中是Caffe),构建静态库的,而不使用PIC。请注意,在这种情况下,在将来的共享库中尝试使用结果库时,您将面临类似的问题

    对于大多数CMake项目,强制构建静态库可以通过以下方式执行:

     cmake -DBUILD_SHARED_LIBS=OFF <other parameters>
    
    cmake-DBUILD\u SHARED\u LIBS=OFF
    

  • 严格来说,PIC特性独立于库的类型(共享或静态)。因此,您可能有一个带有PIC的静态库,或者构建一个没有PIC的共享库

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

    cmake -DPOSITION_INDEPENDENT_CODE=<ON|OFF> <other parameter>
    
    cmake-DPOSITION\u独立\u代码=