【问题标题】:Libpython error while building YouCompleteMe构建 YouCompleteMe 时出现 Libpython 错误
【发布时间】:2014-05-24 07:42:10
【问题描述】:

我正在构建 vim 的 YouCompleteMe 插件,遵循这个 document。当我运行 make 时,出现以下错误。

Linking CXX shared library /home/sagar/.vim/bundle/YouCompleteMe/python/ycm_core.so
/usr/bin/ld: /usr/local/lib/libpython2.7.a(abstract.o): relocation R_X86_64_32S against `_Py_NotImplementedStruct' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libpython2.7.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status

这是什么错误?
我已经安装了pyenv 来管理 python 版本。是不是有问题?

【问题讨论】:

  • 尝试用-fPIC编译它。您还应该有可用的 python 2.7 库。
  • @Lawrence 尝试使用 -fPIC 编译它不起作用,同样的错误。

标签: python vim shared-libraries


【解决方案1】:

使链接器指向 .so(共享对象)文件,而不是 .a(静态库)文件。

您可以在运行 cmake 时指定标志来执行此操作:

cmake -G "Unix Makefiles" -DPYTHON_LIBRARY=/usr/local/lib/libpython2.7.so . ~/.vim/bundle/YouCompleteme/cpp

请注意,即使您使用的是 pyenv,YouCompleteMe 构建也可能指向不希望的 python build,因为它们现在没有被正确地自动检测到。

如果您遇到此问题,您可能还应该正确指定 Python 头文件:

cmake -G "Unix Makefiles" -DPYTHON_LIBRARY=/usr/local/lib/libpython2.7.so -DPYTHON_INCLUDE_DIR=/usr/local/include/python . ~/.vim/bundle/YouCompleteme/cpp

PS=(我假设您的标头在该路径中,请先检查)

【讨论】:

    【解决方案2】:

    由于我的系统上的某些路径与接受的答案(CMake 和 python lib 的)不同,我发布了针对上述问题的替代解决方案:

    1. 确保拥有 libpython2.7.so 的共享库版本

      $ locate libpython
      /usr/lib/x86_64-linux-gnu/libpython2.7.so.1
      
    2. 从 CMake 期望的位置创建指向它的符号链接

      sudo ln -s "/usr/lib/x86_64-linux-gnu/libpython2.7.so.1" "/usr/lib/libpython2.7.so"
      

      或者,如YCM's build script code 中所述,您可以添加额外的 CMake 选项以确保正确找到 .so 库

      export EXTRA_CMAKE_ARGS="-DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so.1"
      

    【讨论】:

    • 在尝试编译 YCM 时遇到同样的错误,符号链接共享库对我不起作用,但导出 CMake 选项可以,谢谢 :-)
    • 在我的 Ubuntu 服务器上编译 Caffe 时出现此错误。创建符号链接解决了我的问题。谢谢!
    猜你喜欢
    • 2018-08-13
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2013-05-25
    • 2017-07-13
    相关资源
    最近更新 更多