Erlang NIF 测试——OS X Lion

Posted

技术标签:

【中文标题】Erlang NIF 测试——OS X Lion【英文标题】:Erlang NIF Test -- OS X Lion 【发布时间】:2012-01-07 11:17:14 【问题描述】:

我正在尝试在 Mac OS X Lion 上编译来自 Erlang (http://www.erlang.org/doc/man/erl_nif.html) 的 NIF 测试。我无法编译它。我是否缺少编译器标志?这是我得到的错误:

Computer:~ me $ gcc -fPIC -shared -o niftest.so niftest.c -I /usr/local/Cellar/erlang/R14B02/lib/erlang/usr/include/
Undefined symbols for architecture x86_64:
  "_enif_make_string", referenced from:
      _hello in ccXfh0oG.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

我也用-m32 试过这个,但它说也没有 i386 架构。

谢谢!

【问题讨论】:

【参考方案1】:

您的问题似乎不是架构而是未定义的符号_enif_make_string,这意味着您必须使用-l 选项与您的enif 库链接,无论它是什么。另外,我已经很长时间没有为 OS X 构建共享库了,但我认为正确的标志是 -dynamiclib 而不是 -shared,而且你不必在 -I 之后有空格.

【讨论】:

如果我有 #include 指令和 -I 标志,那还不足以引用包含文件吗?查看链接。谢谢! @TravisPowell:不,#include 仅用于编译,但不适用于链接。您的错误在于链接,请参阅ld: sym...。这是链接器错误。【参考方案2】:

在编译你的 nif 时尝试使用这些标志而不是 -shared

-bundle -flat_namespace -undefined suppress

【讨论】:

【参考方案3】:

对于 64 位 Erlang,以下适用于我:

gcc -undefined dynamic_lookup -dynamiclib niftest.c -o niftest.so \
    -I /usr/local/Cellar/erlang/R14B02/lib/erlang/usr/include

【讨论】:

动态查找!谢谢:) 非常感谢您的回答:)

以上是关于Erlang NIF 测试——OS X Lion的主要内容,如果未能解决你的问题,请参考以下文章

Erlang NIF 奇怪的 iolist 行为

将二进制文件传递给erlang nif

erlang nif共享库上的未定义符号

Windows上erlang的开发环境

如何在 Erlang 中进行内存映射 IO?

erlang VM 占用大约 600 个 os/windows 机器线程