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_fclose | FILE* 风格打开 / 关闭 |
tcc_vfs_mount_memory / tcc_vfs_unmount | 把内存挂载为 VFS 路径——运行期注入头文件/源码的通道 |
VFS 的静态内容(SDK 头、TCC include、系统库定义)见 VFS 资源参考;mount_memory 让你在运行期给嵌套编译器"凭空"提供文件——宿主自己的脚本装载就是这么做的(源码挂到 /xs/script/%p.c 虚路径再 add_file)。