【问题标题】::erlang.load_nif/2 finds shared library file inside original project but can't find it if the project gets imported:erlang.load_nif/2 在原始项目中找到共享库文件,但如果项目被导入则找不到它
【发布时间】:2022-09-27 22:35:40
【问题描述】:

我已经构建了一个小的 elixir 应用程序,它使用 NIF 函数来执行一些 c++ 代码。 通过以下方式加载 nif:

def load_nifs do
    :erlang.load_nif(\'<relative_path_to_lib>/<lib_name>\', 0)
    :ok
end

这很好用。 现在我想将此应用程序集成到另一个项目中。现在的问题是 load_nif 抛出:无法加载 NIF 库:\'<relative_path_to_lib>/<lib_name>.so:无法打开共享对象文件:没有这样的文件或目录\'\'虽然什么都没有改变。我检查了 deps 文件夹,共享库文件正是它们应该在的位置,因此依赖项似乎已正确加载。我还尝试将 .so 文件与调用 load_nif 的模块(并省略 <relative_path_to_lib>/)以及提供绝对路径放在同一个文件夹中,但均无济于事。

任何帮助表示赞赏,干杯。

关于我的系统的相关信息:

  • 操作系统:Ubuntu 22.04
  • Elixir 版本:Elixir 1.13.0(使用 Erlang/OTP 24 编译)

更新:

问题似乎并不在于文件位于错误的位置,因为它在编译后的第一次测试运行期间找到了文件。 但是,当我重复运行时会发生错误。似乎错误消息是错误的,因为在测试期间没有删除任何文件。

如果我在一个测试中多次重复该函数,则没有问题,所以问题不是因为 NIF 函数被执行多次,而是因为包含该函数的测试被重复多次。

    标签: elixir-mix erlang-nif


    【解决方案1】:

    解决方案:

    我仍然不知道是什么导致了这种行为,但是在将 .so 文件放入 priv 目录并通过以下方式访问它们之后

    :erlang.load_nif(:code.priv_dir(:<app_name>), 0)
    

    测试通过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2022-06-11
      • 2013-07-24
      • 1970-01-01
      • 2013-01-31
      • 2014-06-16
      • 1970-01-01
      相关资源
      最近更新 更多