【问题标题】:can not be used when making a shared object; recompile with -fPIC制作共享对象时不能使用;使用 -fPIC 重新编译
【发布时间】:2017-05-22 12:06:25
【问题描述】:

我尝试安装一个库,但运行 make 后出现以下错误。如何用flag重新编译?

make 扫描目标 pwrutils 的依赖关系 Linking CXX shared 库 libpwrutils.so /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_system.a(error_code.o): 重定位 R_X86_64_32 针对 `.rodata.str1.1' 时不能使用 制作共享对象;使用 -fPIC 重新编译 ,/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_system.a: 添加符号时出错:错误值 collect2:错误:ld 返回 1 退出 status make[2]: * [libpwrutils/libpwrutils.so.1.0] 错误 1 ​​make[1]: * [libpwrutils/CMakeFiles/pwrutils.dir/all] 错误 2 make: *** [all] 错误 2

【问题讨论】:

  • 你在使用 CMake 吗?你喜欢cmake . 或类似的然后make 还是你只有一个Makefile 然后你调用make
  • 是的,我正在使用 Cmake。我试图删除 CMakeCache.txt 并再次运行 cmake 但它当然没有帮助。
  • 您尝试将 sharedlibpwrutils.sostaticlibboost_system.a 链接。这行不通。您应该安装 shared Boost 库,或者将您的库 (libpwrutils.so) 构建为 STATIC。顺便说一句,related question 描述了类似的问题。

标签: linux cmake shared-libraries


【解决方案1】:

根据需要扩展主要 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 等之一。

【讨论】:

    【解决方案2】:

    如果有人遇到这种情况,并且在您的项目中添加 fPIC 标志并没有帮助:

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

    然后我意识到我链接到了其他几个库,所以我不得不用 -fPIC 重新编译它们,这就是问题所在。

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 2016-06-06
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多