【发布时间】:2021-12-24 22:13:40
【问题描述】:
Erlang 运行时系统 (ERTS) 有一些用 C 语言编写的驱动程序,用于与操作系统交互或访问低级资源,据我所知,ERTS 在启动时编译这些驱动程序以准备加载从 Erlang 代码来看,驱动程序 inet_drv.c 是这些驱动程序之一,它用于处理网络任务,例如创建套接字和侦听或接受新的传入连接。
我想手动测试此驱动程序以大致了解 ERTS 的默认行为并了解将来如何有效地实现驱动程序,我跟踪了 Erlang Manual Reference to implementation drivers 说:首先编写和编译通过 OS C 语言编译器的驱动程序,第二次使用 erl_ddll 模块从 erlang 代码加载驱动程序,最后通过衍生的 Erlang 进程链接到驱动程序,所以这非常简单易行。
所以我用驱动程序inet_drv.c 尝试了这些步骤,我搜索了它并尝试使用 Clang 编译器编译它,它是 FreeBSD 系统的默认 C 编译器:
cc inet_drv.c
之后有一个错误说文件erl_driver.h没有定义,这个头文件在驱动程序的代码中被用作包含文件(#include<erl_driver.h>)所以我搜索它并将它的目录路径添加到cc 命令使用-I 选项让编译器在此目录中搜索包含的文件,然后我重新编译它:
cc inet_drv.c -I/usr/ports....
之后,有另一个未定义的文件,所以我做了 5 或 6 次相同的事情,最后,我为包含的文件添加了所有需要的路径,结果是这个命令:
cc inet_drv.c
-I/usr/ports/lang/erlang/work/otp-OTP-21.3.8.18/erts/emulator/beam
-I/usr/local/lib/erlang/usr/include
-I/usr/ports/lang/erlang/work/otp-OTP-21.3.8.18/erts/emulator/sys/unix
-I/usr/ports/lang/erlang/work/otp-OTP-21.3.8.18/erts/include/internal
-I/usr/ports/lang/erlang/work/otp-OTP-21.3.8.18/erts/emulator/sys/common
-I/usr/ports/lang/erlang/work/stage/usr/local/lib/erlang/erts-10.3.5.14/include/internal
我对结果感到惊讶:13 个错误和 7 个警告,shell 输出以及错误和警告描述在下面的链接中。 我的问题是:为什么会出现这些错误?我做错了什么?
由于此驱动程序可以完美地响应 ERTS 网络任务,因此它由 ERTS 编译而没有错误,并且 ERTS 应该使用默认为 Clang 的 OS C 语言编译器,并且应该像我一样添加包含的头文件,所以为什么当我尝试这样做时这不起作用?
【问题讨论】:
标签: c erlang elixir freebsd erlang-otp