ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何快速开发Erlang NIF:erlang.mk c_src插件完整教程(附C/C++编译最佳实践)

如何快速开发Erlang NIF:erlang.mk c_src插件完整教程(附C/C++编译最佳实践) 如何快速开发Erlang NIFerlang.mk c_src插件完整教程附C/C编译最佳实践【免费下载链接】erlang.mkA build tool for Erlang that just works.项目地址: https://gitcode.com/gh_mirrors/er/erlang.mkerlang.mk 是一个开箱即用的 Erlang 构建工具其中内置的c_src 插件可以让开发者无需手写编译脚本就能快速构建 Erlang NIF本地函数接口的 C/C 代码。本教程将带你完整走通 NIF 开发流程从模板生成、自动编译到最佳实践适合刚接触 Erlang 原生扩展的新手和普通用户。为什么需要 Erlang NIFErlang 在并发和容错上无出其右但涉及高性能计算、底层硬件访问、调用第三方 C 库时纯 Erlang 代码会显得力不从心。NIF 正是桥梁Erlang 代码通过极小的开销调用 C/C 函数性能可提升数倍甚至数十倍。erlang.mk 的 c_src 插件源码位于plugins/c_src.mk帮你解决了最繁琐的部分自动探测 Erlang/OTP 环境找到erl_nif.h等头文件路径按平台选择合适编译器与编译参数Linux 用 gcc、macOS 用 cc、Windows/MSYS2 用 MinGW自动把产物输出到priv/目录与 Erlang 的code:priv_dir/1机制天然契合一步生成 NIF 骨架在一个已初始化 erlang.mk 的项目中一条命令即可生成 NIF 模板make new-nif nmy_nif这条命令由plugins/c_src.mk中的new-nif目标实现它会同时创建两个文件文件作用c_src/my_nif.cC 语言 NIF 实现含load、upgrade、unload生命周期回调src/my_nif.erlErlang 侧封装模块负责在-on_load时加载 NIF 动态库模板内置了一个hello/1示例函数调用后返回{hello, 参数}。如果同名文件已存在命令会直接报错拒绝覆盖避免误删你的工作成果。对于多应用项目还可以用make new-nif nmy_nif inapp名把 NIF 生成到指定应用目录下。编译流程零配置自动完成 ️只要项目里存在c_src/目录erlang.mk 就会自动接管 C 代码编译运行make时按需构建c_src/my_nif.c ──gcc -O3 -fPIC──▶ c_src/my_nif.o ──ld -shared──▶ priv/my_nif.so关键机制说明环境文件自动生成首次构建时插件会生成c_src/env.mk其中写入了ERTS_INCLUDE_DIRERTS 头文件、ERL_INTERFACE_INCLUDE_DIR和ERL_INTERFACE_LIB_DIRerl_interface 库三个路径编译命令自动附加这些-I和-L参数环境变化自动失效切换 Erlang/OTP 版本后旧的env.mk会被自动删除并重新生成避免头文件版本不匹配导致的诡异错误增量编译修改 Makefile 或 C 源码后make只重编译受影响的文件c_src 插件核心配置项以下变量在 Makefile 中include erlang.mk之前设置即可覆盖默认值定义位置见plugins/c_src.mk顶部C_SRC_DIRC 源码目录默认c_src/。放在其他位置时可改为$(CURDIR)/my_nif_sourceC_SRC_TYPE产物类型三种可选shared默认动态库Linux 生成.soWindows 生成.dll输出到priv/$(PROJECT)static静态库.a并自动追加-DSTATIC_ERLANG_NIF1宏供链接进可执行文件executable独立可执行文件Windows 下为.exeC_SRC_OUTPUT产物输出路径默认priv/$(PROJECT)SOURCES手动指定源文件列表。不设置时自动收集c_src/下的.c、.C、.cc、.cpp文件平台默认的编译参数平台编译器CFLAGS 亮点Linuxgcc-O3 -stdc99 -finline-functions -Wall -Wmissing-prototypesmacOScc-O3 -stdc99 宽松链接参数-flat_namespace -undefined suppressFreeBSDcc与 Linux 一致Windows (MSYS2)/mingw64/bin/gcc硬编码路径规避默认 cc 不兼容问题所有平台均自动追加-fPIC位置无关代码动态库必需并自动链接erl_interface库-lei。两种编译模式托管构建 vs 自定义 Makefile模式一让 erlang.mk 直接编译推荐无需任何额外文件把 C 代码放进c_src/即可。这是绝大多数 NIF 项目的最佳选择。模式二c_src 下自带 Makefile如果你的 C 代码结构复杂依赖多个子目录、第三方库在c_src/Makefile中写自己的规则即可。erlang.mk 检测到该文件后会退居幕后只在构建时执行make -C c_src清理时执行make -C c_src clean。你的自定义 Makefile 中仍可以include env.mk来享受环境探测能力。C/C 编译最佳实践清单 ✅结合插件实现推荐以下实践NIF 必须保证线程安全NIF 运行在多个轻量进程共享的虚拟机线程上模板中的load/upgrade/unload回调就是为管理全局私有数据准备的私有数据初始化放在load中、释放放在unload中静态 NIF 记得声明宏使用C_SRC_TYPE static时插件已自动定义STATIC_ERLANG_NIFC 代码中据此调整入口导出方式无需手动加参数向子 Makefile 传递参数用目标级导出全局export会污染依赖库的构建。正确做法是为app-c_src目标单独导出例如app-c_src: export CFLAGS -DDEBUG仅在构建 C 代码时生效手动指定源文件当c_src/下混有测试代码或工具代码时用SOURCES变量精确列出要参与编译的文件善用make clean与make distcleanclean删除.o和产物但保留env.mkdistclean连环境文件一起清掉适合切换 OTP 版本后强制全新构建验证你的 NIF 构建erlang.mk 自带的测试套件test/plugin_c_src.mk覆盖了完整流程包括模板生成后自动构建并校验c_src/my_nif.o、c_src/env.mk、priv/my_nif.so全部存在运行 Erlang 实际调用 NIF 函数断言{hello, joe} my_nif:hello(joe)等结果修改 Makefile 后确认所有产物被正确重编译静态 NIF 场景下用objdump校验.a库中确实导出了 NIF 符号你可以在本地参考该文件直接验证自己的项目行为是否符合预期。小结需求命令 / 配置生成 NIF 模板make new-nif nmy_nif编译含 C 代码make切换静态库Makefile 中设C_SRC_TYPE static复杂 C 工程在c_src/Makefile写自定义规则清理全部 C 产物make distclean借助 c_src 插件你只需关注 C 逻辑本身环境探测、平台适配、产物路径这些脏活累活全部由 erlang.mk 完成。完整说明参见项目文档doc/src/guide/ports.asciidoc插件实现细节可阅读plugins/c_src.mk与 NIF 模板源码测试用例见test/plugin_c_src.mk。上手试试吧你的第一个 Erlang NIF 离现在只差一条make命令的距离 【免费下载链接】erlang.mkA build tool for Erlang that just works.项目地址: https://gitcode.com/gh_mirrors/er/erlang.mk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表