ARTICLE DETAIL

资讯详情

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

scriptc的--print=native-link-info深度解析:机器可读链接配方怎么用

scriptc的--print=native-link-info深度解析:机器可读链接配方怎么用 scriptc的--printnative-link-info深度解析机器可读链接配方怎么用【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptcscriptc是一个 TypeScript-to-Native Compiler能把 TypeScript 直接编译成本机可执行文件。而--printnative-link-info是它藏在scriptc build里的一个工具人友好选项让编译器把链接一个完整可执行文件所需的全部信息以一份机器可读的 JSON 链接配方输出到 stdout供你自己的构建工具、CI 流水线或自定义链接脚本消费。这篇指南带你读懂这份配方并动手用它完成一次外部链接。什么是机器可读链接配方通常scriptc build会自己完成编译链接一条龙最后只在 stdout 打印可执行文件路径。加上--printnative-link-info后行为变成照常编译出程序对象文件object file但 stdout 不再是路径而是一份纯 JSON 文档缩进 2 空格schema 为scriptc.native-link-info.v1文档里完整描述了目标平台、程序对象、运行时 ABI、运行时源码包清单、FFI 依赖以及精确的链接输入顺序和驱动参数。一句话它把编译器内部怎么链接变成了一份可以被任意工具解析的食谱。 两个硬性约束在 packages/cli/src/main.ts 中实现只能在build命令下使用run等其他命令会直接报错必须搭配--emitobj或不指定--emit此时自动按 obj 处理。快速上手一条命令生成配方以仓库内置示例 examples/native-object/ 为例scriptc build main.ts --ffi ffi.json --printnative-link-info -o app.o link-info.json这条命令做了三件事编译main.ts得到app.o、声明 FFI 配置文件、把链接配方重定向到link-info.json。此后link-info.json就是唯一的事实来源——你的脚本只需要读它不需要关心 scriptc 的内部实现。⚠️ 注意配方路径完全不依赖本地缓存测试里明确断言不含node_modules/.cache因此可以跨机器传递、入库或发布给下游构建。配方里的 6 个核心字段下面这份表格带你快速认识 NativeLinkInfo 结构定义在 packages/compiler/src/backend/native-link-info.ts字段含义典型值/说明schema/format文档协议标识scriptc.native-link-info.v1、1消费前先校验它target目标平台描述名称、LLVM triple如arm64-apple-macosx14.0.0、架构、对象格式macho等、最低 OS 版本、重定位模型program程序对象信息对象文件路径、入口符号固定为main、未定义运行时符号前缀scr_runtime_abi运行时 ABI 版本版本号 scr_runtime_abi_v*标记符号runtime_pack运行时源码包包名scriptc/runtime、精确版本号、root根目录以及source_sets每组的源码清单、头文件目录、宏定义和编译参数link链接总装说明input_order输入顺序、driver_flags驱动参数、system_libraries系统库、frameworksmacOS 框架几个值得记住的设计点link.input_order的顺序是刻意的程序对象 → FFI 库 → 运行时对象 → 第三方归档 → 系统库。链接器对输入顺序敏感抄错顺序就可能链接失败。这一点在 packages/compiler/src/backend/link-plan.ts 中有明确注释。source_sets是配方的核心每个集合给出nameruntime/libregexp/quickjs/mbedtls、outputobjects 或 archive、建议产物名以及可直接执行的c_flags、defines、include_directories。你的构建脚本照单编译即可。object_abi标注了稳定性experimentalexact-runtime-version意味着外部对象 ABI 仍在演进必须使用与编译器完全匹配版本的运行时。实战用配方链接出原生可执行文件examples/native-object/link.mjs 是一个现成的配方消费者支持两种模式node link.mjs cc link-info.json app-cc # 用 C 编译器clang作为链接驱动 node link.mjs ld link-info.json app-ld # 直接调用 Apple 链接器 ld ./app-cc # 两种产物行为一致均输出 42它的工作流程可以概括为四步校验检查schema是否为scriptc.native-link-info.v1并核对runtime_pack.root下package.json的包名与版本是否和配方一致身份不匹配立即报错编译运行时遍历source_sets按c_flags/defines/头文件目录逐文件编译output: objects的集合产出对象文件output: archive的集合用ar打包成归档组装链接按program.object→ FFI 库 → 运行时对象 → 第三方归档的顺序拼接输入附加driver_flags、system_libraries如 macOS 的System与frameworks产出可执行文件cc模式交给 clangld模式通过xcrun定位 SDK 后直接驱动ld。 两种模式的意义证明这份配方既能喂给编译器当链接器用也能喂给裸链接器——即信息是自洽、完整的。工具开发者避坑清单如果你要为 scriptc 写自动化工具这几条能省很多时间✅先校验 schema不支持的版本直接拒绝别做隐式兼容✅锁定运行时版本runtime_pack.version是唯一可信来源scr_runtime_abi_v*标记符号保证 ABI 不匹配时在链接期就失败而不是运行时才炸✅保持 stdout 纯净配方走 stdout普通产物路径已包含在program.object字段里两者不会互相污染✅FFI 场景看ffi字段formatnull 表示无 FFI 契约、symbols要求的外部函数符号、libraries需要前置的归档库都在这里❌不要改动source_sets里任何文件清单它们与编译器版本精确对应混用不同版本运行时会破坏exact-runtime-version承诺。延伸阅读关键源码与测试资料说明packages/compiler/src/backend/native-link-info.ts配方生成核心NativeLinkInfo类型与运行时源码集推导逻辑packages/compiler/src/backend/link-plan.ts实际链接计划的输入顺序定义与配方中link字段同源packages/cli/src/main.tsCLI 侧的选项校验与 JSON 输出packages/cli/src/usage.ts--print选项的使用说明examples/native-object/完整的外部链接示例工程macOS arm64packages/cli/test/native-link-info.test.ts端到端测试校验报错信息、缓存无关性、不触发外部工具docs/src/app/cli/page.mdx官方 CLI 文档小结--printnative-link-info把 scriptc 的链接知识导出成了一份自包含的 JSON 食谱平台、对象、ABI、运行时源码、链接顺序一次给全。只要你的脚本会读 JSON就能脱离 scriptc 内部实现独立编译运行时、调用任意编译器或链接器构建出与官方产物行为一致的原生可执行文件——这正是它在嵌入、交叉编译和定制工具链场景中的价值所在。【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表