【问题标题】:Caffe build gives GCC Link Error "can not be used when making shared object.; recompile with -fPIC"Caffe 构建给出 GCC 链接错误“在制作共享对象时无法使用。;使用 -fPIC 重新编译”
【发布时间】:2018-07-15 00:15:20
【问题描述】:

我正在尝试使用 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 命令,或者我应该做些什么?

【问题讨论】:

    标签: gcc cmake g++ caffe


    【解决方案1】:

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

    您无法构建共享库 libcaffe.so with PIC(位置无关代码)功能并将其与静态库链接 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多