运行用C语言编写的 luajit 对象文件。
2013-10-17 1:54:28
收藏:0
阅读:113
评论:2
从文档中得知:http://luajit.org/running.html
luajit -b test.lua test.obj # 生成对象文件
# 将 test.obj 与您的应用程序连接,并使用 require("test") 进行加载
但是并没有解释如何执行这些操作。我猜他们假设使用 Lua 的人也是 C 程序员,但我不是!我能得到一些帮助吗?以 GCC 为例。
我还想从 C 字节数组标头执行相同的操作。我也找不到有关此的说明文档。
luajit -bt h -n test test.lua test.h
这将创建标头文件,但我不知道如何在 C 中运行它。谢谢。
点赞
用户1657919
main.lua
print("Hello from main.lua")
app.c
#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
int main(int argc, char **argv)
{
int status;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_getglobal(L, "require");
lua_pushliteral(L, "main");
status = lua_pcall(L, 1, 0, 0);
if (status) {
fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));
return 1;
}
return 0;
}
Shell commands:
luajit -b main.lua main.o
gcc -O2 -Wall -Wl,-E -o app app.c main.o -I/usr/local/include/luajit-2.1 -L/usr/local/lib -lluajit-5.1 -lm -ldl
将 -Ixx 和 -Lxx 替换为 LuaJIT 的 include 和 library 目录。如果您已经在 /usr/local 安装了 LuaJIT(默认情况),则大多数 GCC 安装将无需这两个选项即可找到它。
第一个命令将 Lua 源代码编译为字节码,并将其嵌入到对象文件 main.o 中。
第二个命令编译和链接最小的 C 应用程序代码。请注意,它还链接嵌入的字节码。-Wl,-E 是必需的(在 Linux 上)以导出可执行文件中的所有符号。
现在将原始的 main.lua 移出(以确保它真正运行嵌入的字节码而不是 Lua 源代码文件),然后运行您的应用程序:
mv main.lua main.lua.orig
./app
# 输出:Hello from main.lua
2013-10-17 13:24:38
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
基本用法如下:
#include该头文件这里是一个最小化的示例:
test.lua
return { fooprint = function (s) return print("from foo: "..s) end, barprint = function (s) return print("from bar: "..s) end }test.h
// luajit -b test.lua test.h #define luaJIT_BC_test_SIZE 155 static const char luaJIT_BC_test[] = { 27,76,74,1,2,44,0,1,4,0,2,0,5,52,1,0,0,37,2,1,0,16,3,0,0,36,2,3,2,64,1,2,0,15, 102,114,111,109,32,102,111,111,58,32,10,112,114,105,110,116,44,0,1,4,0,2,0,5, 52,1,0,0,37,2,1,0,16,3,0,0,36,2,3,2,64,1,2,0,15,102,114,111,109,32,98,97,114, 58,32,10,112,114,105,110,116,58,3,0,2,0,5,0,7,51,0,1,0,49,1,0,0,58,1,2,0,49,1, 3,0,58,1,4,0,48,0,0,128,72,0,2,0,13,98,97,114,112,114,105,110,116,0,13,102, 111,111,112,114,105,110,116,1,0,0,0,0 };runtest.cpp
// g++ -Wall -pedantic -g runtest.cpp -o runtest.exe -llua51 #include <stdio.h> #include <assert.h> #include "lua.hpp" #include "test.h" static const char *runtest = "test = require 'test'\n" "test.fooprint('it works!')\n" "test.barprint('it works!')\n"; int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); lua_getglobal(L, "package"); lua_getfield(L, -1, "preload"); // package, preload, luaJIT_BC_test bool err = luaL_loadbuffer(L, luaJIT_BC_test, luaJIT_BC_test_SIZE, NULL); assert(!err); // package.preload.test = luaJIT_BC_test lua_setfield(L, -2, "test"); // check that 'test' lib is now available; run the embedded test script lua_settop(L, 0); err = luaL_dostring(L, runtest); assert(!err); lua_close(L); }这很简单。此示例将字节码放入该程序的 lua 环境的
package.preload表中。然后,其他 lua 脚本可以通过执行require 'test'来使用它。在runtest嵌入的 lua 源码正是这样做的,并输出:from foo: it works! from bar: it works!