在制作共享对象时不能使用;请使用 -fPIC 重新编译。

13
我尝试安装一个库,但在运行make后出现了以下错误。如何重新编译并加上标志?
$ make
Scanning dependencies of target pwrutils
Linking CXX shared library libpwrutils.so /usr/bin/ld:
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_system.a(error_code.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
,/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_system.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [libpwrutils/libpwrutils.so.1.0] Error 1
make[1]: *** [libpwrutils/CMakeFiles/pwrutils.dir/all] Error 2
make: *** [all] Error 2

你使用CMake吗?你是像 cmake . 这样的方式然后再用 make ,还是你有一个Makefile并调用 make 呢? - fedepad
是的,我正在使用CMake。我尝试删除CMakeCache.txt并再次运行cmake,但当然没有帮助。 - Kasia
您试图将 共享libpwrutils.so 链接到 静态libboost_system.a,但这不起作用。您应该安装共享的 Boost 库,或者将您的库(libpwrutils.so)构建为静态库。顺便说一下,相关问题描述了相似的问题。 - Tsyvarev
可能是Linux上的共享库和-fPIC错误的重复问题。 - Tsyvarev
2个回答

7

如果有人遇到这个问题,而将fPIC标志添加到项目中无法解决:

我也遇到了同样的问题,并且在我的CMakeLists中正确设置了-fPIC标志,在编译日志中也可以验证,例如,我看到: /usr/bin/c++ -fPIC ... etc.

然后我意识到我链接了另外几个库,所以我必须重新编译这两个库并加上-fPIC标志,这才是问题所在。


0

根据需要在主要的CMakeLists.txt中扩展编译器标志。

############################################################
# Compiler and linker flags
set(CMAKE_CXX_FLAGS                " ${CMAKE_CXX_FLAGS_INIT} -std=c++11 -fPIC")
set(CMAKE_CXX_FLAGS_DEBUG          "-g -DDEBUG")
set(CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DDEBUG"

删除缓存并重新执行cmake命令。使用ccmake或cmake-gui检查CMAKE_BUILD_TYPE是否非空,而是Debug、Release等之一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接