构建YouCompleteMe时出现Libpython错误

构建YouCompleteMe时出现Libpython错误,python,vim,shared-libraries,Python,Vim,Shared Libraries,我正在构建vim的YouCompleteMe插件,如下所示。当我运行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

我正在构建vim的
YouCompleteMe
插件,如下所示。当我运行
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
这是什么错误?

我已经安装了用于管理python版本的软件。它会导致问题吗?

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

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

cmake -G "Unix Makefiles" -DPYTHON_LIBRARY=/usr/local/lib/libpython2.7.so . ~/.vim/bundle/YouCompleteme/cpp
请注意,即使您使用的是pyenv,YouCompleteMe build也可能指向不需要的 python构建,因为它们现在没有被正确地自动检测到

如果遇到此问题,可能还应该正确指定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=(我假设您的头在该路径中,请在前面检查)

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

  • 确保具有libpython2.7.so的共享库版本

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

    sudo ln -s "/usr/lib/x86_64-linux-gnu/libpython2.7.so.1" "/usr/lib/libpython2.7.so"
    
    或者,如中所述,您可以添加其他CMake选项以确保正确找到.so库

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

  • 试着用
    -fPIC
    编译它。您还应该有可用的python 2.7库。@Lawrence尝试使用
    -fPIC
    编译,但不起作用,出现了相同的错误。尝试编译YCM时出现了相同的错误,符号链接共享库对我不起作用,但导出CMake选项确实起作用,谢谢:-)我在Ubuntu服务器上编译Caffe时出现了此错误。创建一个符号链接解决了我的问题。谢谢