Caffe 构建给出 GCC Link 错误 "can not be used when making shared object.; recompile with -fPIC"
Caffe build gives GCC Link Error "can not be used when making shared object.; recompile with -fPIC"
我正在尝试使用 CMake 安装 caffe,但是当我 运行 make all
(在 运行ning 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 create/use 带有 -fPIC 选项的 gcc 命令,或者我应该做些什么?
错误不是来自 CMake,而是来自 linker。它实际上告诉我们:
你不能构建共享库 libcaffe.so
with PIC (位置独立代码) 功能和 link 它与 静态库 libleveldb.a
编译 没有 此功能。
可能的解决方案是:
获取共享版本的静态库(libleveldb.a
在你的情况下),所以它会用PIC编译。这就是错误消息提示您的内容。
而不是构建共享库(在你的例子中是Caffe),构建静态库,不使用 PIC。请注意,在这种情况下,当您尝试在未来的共享库中使用结果库时,您将面临类似的问题。
对于大多数强制构建静态库的 CMake 项目,可以通过以下方式执行:
cmake -DBUILD_SHARED_LIBS=OFF <other parameters>
严格来说,PIC 功能独立于库的类型(共享或静态)。因此,您可能拥有一个带有 PIC 的 静态库,或者构建一个没有 PIC 的 共享库。
对于许多 CMake 项目,您可以使用
控制创建的库的 PIC 功能
cmake -DPOSITION_INDEPENDENT_CODE=<ON|OFF> <other parameter>
我正在尝试使用 CMake 安装 caffe,但是当我 运行 make all
(在 运行ning 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 create/use 带有 -fPIC 选项的 gcc 命令,或者我应该做些什么?
错误不是来自 CMake,而是来自 linker。它实际上告诉我们:
你不能构建共享库 libcaffe.so
with PIC (位置独立代码) 功能和 link 它与 静态库 libleveldb.a
编译 没有 此功能。
可能的解决方案是:
获取共享版本的静态库(
libleveldb.a
在你的情况下),所以它会用PIC编译。这就是错误消息提示您的内容。而不是构建共享库(在你的例子中是Caffe),构建静态库,不使用 PIC。请注意,在这种情况下,当您尝试在未来的共享库中使用结果库时,您将面临类似的问题。
对于大多数强制构建静态库的 CMake 项目,可以通过以下方式执行:
cmake -DBUILD_SHARED_LIBS=OFF <other parameters>
严格来说,PIC 功能独立于库的类型(共享或静态)。因此,您可能拥有一个带有 PIC 的 静态库,或者构建一个没有 PIC 的 共享库。
对于许多 CMake 项目,您可以使用
控制创建的库的 PIC 功能cmake -DPOSITION_INDEPENDENT_CODE=<ON|OFF> <other parameter>