如何切换VSCode的Elixir-LS版本匹配本地Erlang/Elixir解决NIF问题
问题分析与解决方案
问题本质
你的NIF加载错误核心原因是Elixir-LS的运行环境和项目编译环境不兼容:
- Elixir-LS 0.11.0基于Erlang 22编译,而你的iconv NIF是用本地Erlang 24编译的
- NIF与Erlang/OTP版本强绑定,不同版本的Erlang无法加载彼此编译的NIF文件
mix test用的是本地Erlang 24环境,所以能正常加载;VSCode调试时是Elixir-LS的进程(基于Erlang 22)去加载项目代码,因此报错
关于Elixir-LS的编译问题
需编译的项目:
直接编译官方的elixir-ls主项目即可,它包含了所有核心组件(language server、调试器等),不需要单独编译子项目。是否必须重编译:
是的,必须用你本地的Erlang 24.3.4.6和Elixir 1.14.1-otp-24重新编译Elixir-LS,让它的运行环境与项目编译环境完全匹配,才能解决NIF加载问题。
具体编译与配置步骤
- 克隆Elixir-LS仓库,切换到v0.11.0标签(保持版本一致)
- 在本地环境下执行编译命令:
mix deps.get mix compile mix elixir_ls.release - 在VSCode设置中,找到
ElixirLS: Server Path,设置为编译后生成的可执行文件路径:- Linux/macOS:
{仓库目录}/release/language_server.sh - Windows:
{仓库目录}/release/language_server.bat
- Linux/macOS:
额外说明
之前在launch.json中排除:iconv_app无法解决问题,因为调试器仍会加载项目的依赖代码,只有让Elixir-LS的运行环境版本与项目编译环境一致,才能从根本上解决NIF加载不兼容的问题。
内容的提问来源于stack exchange,提问作者Chen Yu
相关产品推荐
相关产品推荐

