构建YouCompleteMe时的Libpython错误

7 投票
2 回答
4176 浏览
提问于 2025-04-18 02:12

我正在按照这个 文档 来构建 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

这个错误是什么呢?
我已经安装了 pyenv 来管理 Python 版本。这会导致问题吗?

2 个回答

6

因为我系统上的一些路径和大家接受的答案不一样(包括CMake和Python库的路径),所以我想分享一个不同的解决方案:

  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的构建脚本代码中所写的那样,你可以添加额外的CMake选项,以确保正确找到这个.so库

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

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

你可以在运行 cmake 时通过指定一个标志来做到这一点:

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

需要注意的是,即使你在使用 pyenv,YouCompleteMe 的构建可能会指向一个不想要的 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=(我假设你的头文件在那个路径下,记得检查一下)

撰写回答