我正在构建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版本。这会引起问题吗?
答案 0 :(得分:6)
使链接器指向.so(共享对象)文件而不是.a(静态lib)文件。
您可以在运行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 =(我假设您的标题在该路径中,请先检查)
答案 1 :(得分:6)
由于我的系统上的某些路径与接受的答案(CMake和python lib)不同,我正在为上述问题发布备用解决方案:
确保拥有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"
或者,如YCM's build script code中所写,您可以添加其他CMake选项以确保正确找到.so库
export EXTRA_CMAKE_ARGS="-DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so.1"