26 个导出符号 · 清单核对自 src/script/tcc_host.h

嵌套编译与 VFS 参考

应用层插件系统的地基:脚本可以再创建 TCC 编译器,编译新代码并解析符号。推荐入口是 xsCreateTCC——它预置了标准 include/lib 路径与全部宿主符号导入;下表是它背后暴露的完整能力面。

xsCreateTCC 的预置内容

预置项内容
输出类型TCC_OUTPUT_MEMORY——编译产物纯内存,不落盘
include 路径应用 dev_inc + VFS 内置 SDK(xsbase.h / xrt_decl.h / libtcc.h)
符号导入与宿主同款四层符号表:xrt 3,030 + XServer 契约 21 + libtcc/VFS 26 + 扩展(按变体)
系统库Windows 下 msvcrt/kernel32 自动;7 个系统库显式可用

即:嵌套编译的代码与宿主脚本同权——能调用一切 API(包括再嵌套)。这是能力也是责任,边界讨论见 第 40 章与 第 44 章。

编译器控制(18)

函数用途
tcc_new / tcc_delete创建 / 销毁编译器实例(delete 前确保产物符号不再使用)
tcc_set_lib_path / tcc_set_options库搜索根 / 命令行式选项
tcc_set_error_func编译错误回调(默认打到 stderr——插件场景应接管)
tcc_add_include_path / tcc_add_sysinclude_path普通 / 系统头搜索路径
tcc_define_symbol / tcc_undefine_symbol预定义 / 取消宏(如扩展开关 XS_USE_SQLITE=1)
tcc_add_library_path / tcc_add_library库目录 / 链接库(配合应用 dev_lib)
tcc_add_file编译源文件(磁盘或 VFS 路径)
tcc_add_symbol注册宿主符号(name → 地址)——插件调用宿主的通道
tcc_set_output_type输出形态(插件用 MEMORY)
tcc_compile_string编译源码字符串——表达式求值 / 动态插件的主入口
tcc_output_file输出到文件(导出 .dll/.so 场景;插件模式不用)
tcc_relocate链接重定位到内存——之后才能取符号
tcc_get_symbol按名取产物符号地址(函数指针拿到即可调用)
插件编译五步
TCCState* pTcc = xsCreateTCC();            /* 1. 预置好的实例 */
/* 2. (可选)tcc_add_symbol 注册插件专用符号   */
tcc_compile_string(pTcc, sPluginSource);    /* 3. 编译 */
tcc_relocate(pTcc, TCC_RELOCATE_AUTO);      /* 4. 重定位 */
void* pfn = tcc_get_symbol(pTcc, "plugin_main");
/* 5. 调用;不再使用时 xsDestroyTCC(pTcc) */

VFS 文件层(8)

函数用途
tcc_vfs_open / tcc_vfs_close打开 / 关闭 VFS 文件句柄
tcc_vfs_read / tcc_vfs_lseek读 / 定位(POSIX 风格语义)
tcc_vfs_fopen / tcc_vfs_fcloseFILE* 风格打开 / 关闭
tcc_vfs_mount_memory / tcc_vfs_unmount把内存挂载为 VFS 路径——运行期注入头文件/源码的通道

VFS 的静态内容(SDK 头、TCC include、系统库定义)见 VFS 资源参考;mount_memory 让你在运行期给嵌套编译器"凭空"提供文件——宿主自己的脚本装载就是这么做的(源码挂到 /xs/script/%p.c 虚路径再 add_file)。