You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多Erlang应用共享外部模块的配置与加载问题

Erlang多应用共享模块问题解决方案

问题背景

我有一个由多个应用组成的Erlang项目,这些应用需要使用相同的记录和函数进行通信,因此希望创建一个“shared”模块供它们共享。尝试使用code:add_path和code:load_file函数后,应用访问共享函数时仍出现undef错误。这些应用分别通过rebar3 shell和基于erlang.mk的make run启动。还尝试过code:load_abs及在vm.args中添加-pa <file_path>的方式,但问题依旧。

1. 在基于erlang.mk的Makefile方式中如何添加外部模块?

  • 设置ERL_LIBS环境变量:在Makefile中添加export ERL_LIBS := /path/to/shared:$(ERL_LIBS),让Erlang VM自动在指定路径下查找共享模块和应用,这是最简便的方式
  • 作为依赖引入:如果shared是独立的Erlang应用,在项目Makefile中添加DEPS += shared,同时指定DEPS_DIR ?= ../(假设shared模块在当前项目同级目录),erlang.mk会自动编译并加载这个依赖
  • 添加源码/include路径:如果需要编译时引用shared的头文件(比如记录定义),在Makefile中设置ERLC_OPTS += -I /path/to/shared/src -I /path/to/shared/include,确保编译阶段能找到所需的定义

2. 运行时加载并添加共享模块的最佳方式是什么?

  • 优先使用ERL_LIBS环境变量:这是Erlang官方推荐的标准方式,启动VM前设置export ERL_LIBS=/path/to/shared,或者在启动命令中直接指定erl -env ERL_LIBS /path/to/shared,VM会自动扫描该路径下的所有应用和模块,无需手动调用加载函数,能避免大部分路径问题
  • 动态加载的正确姿势:如果必须在运行时动态加载,先确认共享模块的beam文件已编译,然后调用code:add_patha("/path/to/shared/ebin")(将路径加到搜索路径头部,优先查找),再调用code:load_module(shared)加载指定模块;注意路径必须指向编译后的beam文件所在的ebin目录,而非源码目录
  • 避免混用加载方式:不要同时使用vm.args的-pa参数和手动code:add_path调用,容易导致路径冲突;-pa本质是在VM启动时执行code:add_patha,确保所有方式指向的路径都是正确的ebin目录

提示:之前出现undef错误,大概率是因为路径指向了源码目录而非ebin目录,或者模块未编译,又或者加载模块的时机晚于调用模块的代码执行时机。

内容的提问来源于stack exchange,提问作者halfway258

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:26:20