问题
前天做系统迁移,将x86架构的机器迁移到了arm架构的机器上,发现vim的YouCompleteMe出现了问题,不能正常使用。按照正常套路,需要进行一次重新编译才行。但是在重新编译时,报了以下错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/path/to/k-vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/libs/python/src/converter/builtin_converters.cpp:51:14: error: cannot initialize return object of type 'void *' with an rvalue of type 'const char *' return PyUnicode_Check(obj) ? _PyUnicode_AsString(obj) : 0; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/homebrew/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/include/python3.9/unicodeobject.h:115:18: note: expanded from macro 'PyUnicode_Check' PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) ^ /opt/homebrew/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/include/python3.9/object.h:633:41: note: expanded from macro 'PyType_FastSubclass' #define PyType_FastSubclass(type, flag) PyType_HasFeature(type, flag) ^ 1 error generated. [19/67] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/python/src/list.cpp.o ninja: build stopped: subcommand failed. ERROR: the build failed. |
这该怎么办呢?
解决
一开始我还想着一看python3不行,我们换成python2呗。看了下,ARM原生的brew安装的vim,只带了python3的依赖。如果不想自己重新编译vim,那就得解决这个问题。
要不就看看这个代码啥问题吧。
其实这个报错信息已经很清楚了,一个const char *
右值不能直接在当作void *
返回值返回的时候,报了错。我相信这个代码是不规范的,但应当是XCode 13更新了clang之后,错误检查更严格了,才报这个问题。
于是进行了如下修改,打开对应的源文件,定位到报错的第51行,将代码改成如下样子,强制转换待赋值类型到void *
1 2 |
return PyUnicode_Check(obj) ? (void *) _PyUnicode_AsString(obj) : 0; |
显式进行一下类型转换。接着重新编译,过了!
问题解决。