标签: luajit

如何静态构建和链接LuaJIT(VS 2013)

前提:我希望我的C++应用程序不依赖于任何东西Microsoft Visual C++ redistributable,所以我可以发送可以开箱即用的可执行文件.

什么我先做:运行时库切换到Multithread (/MT)从DLL Multithread (/MD)以避免需要msvcr110.dll(?,不应该VS 2013需要120版本,因为它是编译器版本).为此,我还必须使用相同的运行时库重新编译我正在使用的另一个库,这样才有效.我的.exe可以在任何地方运行而没有问题(或者我不知道,哈哈).

然后我添加了一些使用LuaJIT的功能.我已经通过msvcbuild.bat提供的包构建了LuaJIT ,它就像一个魅力,但现在我的可执行文件需要msvcr110.dll运行.我想这是因为LuaJIT是用/ MD标志编译的,但我想知道是否有一种正确的方法来做我想要的.

c++ linker luajit visual-studio-2013

3
推荐指数
1
解决办法
3930
查看次数

LuaJIT vs luac用于自定义Lua字节码解释器

相关:标准Lua字节码和LuaJIT字节码之间的差异

我正在写一个Lua字节码解释器,我正在尝试在LuaJIT和luac之间做出决定来生成初始字节码.因为我正在编写一个解释器,所以我不会得到任何JIT性能,所以这一切都取决于编译器的质量和生成的字节码的设计.

是否要么编译器明显更好?

我在Dart(也是解释)中写这个,所以我们赞赏编译器的任何免费优化.

lua interpreter bytecode luajit

2
推荐指数
1
解决办法
2531
查看次数

如何在Linux下的luajit中捕获SIGUSR1?

我想在luajit中捕获SIGINT.最终我希望能够捕获SIGUSR1.目的是允许我编写logrotate compatable日志记录,在收到SIGUSR1时,日志文件被关闭然后重新打开.

我怎么能用FFI做到这一点?

这是我到目前为止所拥有的.

local ffi = require("ffi")
local C = ffi.C

local SIG_ERR = -1
local SIGINT  = 1
local SIGUSR1 = 10


ffi.cdef[[
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
]]


local function handler(signo)
   print("caught sig\n")
end

if C.signal(SIGINT, handler) == SIG_ERR then
  print("Can't catch SIGINT\n")
end

while 1 do
end
Run Code Online (Sandbox Code Playgroud)

实际上,我认为这里有几件事情.我注意到你必须按两次ctrl + c然后程序退出.并且"抓住了sig"并没有被称为时间.我认为lua解释器的C端已经捕获了SIGINT.

所以我决定将SIGINT更改为SIGUSR1,因为这最终是我需要的.我注意到它触发了捕获,但我得到了

"PANIC: unprotected error in call to Lua API (bad callback)"
Run Code Online (Sandbox Code Playgroud)

听起来我的回调函数的格式有问题,但我不知道如何纠正它.Lua对我来说仍然是一个新鲜事物.

c linux lua ffi luajit

2
推荐指数
1
解决办法
815
查看次数

创建一个回调结构以传递给LuaJIT FFI

所以首先我加载一个我需要的DLL

local ffi = require("ffi")
local theDLL = ffi.load("thisDLL")
Run Code Online (Sandbox Code Playgroud)

在ffi cdef我有两种不同的结构

ffi.cdef [[
    typedef struct StructSession StructSession;
    typedef struct {
        /*
        * begin_proj callback
        */
        bool (__cdecl *begin_proj)(char *proj);

        /*
        * save_proj_state
        */
        bool (__cdecl *save_proj_state)(unsigned char **buffer, int *len);
    } StructCallbacks;
Run Code Online (Sandbox Code Playgroud)

我在cdef中也有这个功能

__declspec(dllexport) int __cdecl start_session(StructSession **session,
                                                           StructCallbacks *cb);
Run Code Online (Sandbox Code Playgroud)

现在我想调用这个函数

print(theDLL.start_session(a,b))
Run Code Online (Sandbox Code Playgroud)

变量a和b显然是占位符,问题是如何传递函数所需的结构?并说我们得到StructSession工作,正在回复一个函数WITHIN LuaJIT甚至可以用于StructCallbacks?

c++ dll lua ffi luajit

2
推荐指数
1
解决办法
811
查看次数

定期Lua翻译与LuaJIT翻译?

所以,我只是想知道使用普通的Lua解释器而不是LuaJIT解释器是否有任何优势?

lua interpreter luajit

2
推荐指数
1
解决办法
2797
查看次数

Lua中将字符串转换为数组

为什么这个语法有效:

if ({A=1,B=1,C=1})["A"]  then print("hello") end
Run Code Online (Sandbox Code Playgroud)

虽然这不会:

local m = {string.sub(string.gsub("A,B,C,", ",", "=1,"),1,-2)}

if (m)["A"]  then print("hello") end
Run Code Online (Sandbox Code Playgroud)

???

我认为这是因为字符串不是数组,但是如何将字符串("a,b,c")转换为数组({a=1,b=1,c=1})?

lua luajit

2
推荐指数
1
解决办法
3003
查看次数

如何获取lua字符串匹配来解析环境变量字符串?

我有一个用lua编写的配置文件解析器.

我想检测作为环境变量的值并使用os.getenv更改它们.

这可能有点雄心勃勃,因为我可以拥有像这样的价值观

"a string with an embedded ${VARIABLE} in here"
Run Code Online (Sandbox Code Playgroud)

要么

"another string with an env $VARIABLE"
Run Code Online (Sandbox Code Playgroud)

而且我应该允许使用double $$来逃避它们以允许文字$.

我该怎么做呢?

这是我到目前为止所做的,但这是不对的

local envvar = string.match(value, "%$([%w_]+)")
if envvar then
  print("Envvar=", envvar)
  value = value:gsub("(%$[%w_]+)", os.getenv(envvar))
end
Run Code Online (Sandbox Code Playgroud)

例如,我无法弄清楚如何在此处使用%b余额选项来正确匹配{}组合.并使它们可选.如何稳健地完成这项工作?

事实上,我意识到它可能比这更复杂.如果指定了多个环境变量怎么办?

lua string-matching luajit lua-patterns

2
推荐指数
1
解决办法
242
查看次数

Luajit 相当于 string.pack 和 string.unpack?

我需要以字节形式保存 lua 浮点数列表并将其附加到一个字符串。我知道 Lua 5.3 存在 string.pack 但我仅限于 Luajit。我对 FFI 不太熟悉,如果它有解决方案,我将不胜感激使用它的帮助(使用 tostring(number) 只是使用了太多的数字字节,并且内存有限)

基本上,我需要一种方法来使用 Luajit 获取数字列表(现在为浮点数)的二进制字符串打包形式,并能够将其存储在字符串中并将该字符串连接到另一个字符串,甚至在其后面写入内容(我在 5.3 中遇到了这个问题,所以不确定您在下面向我建议的任何解决方案是否可行)

另外,如果操作正确,我是否可以在获得的字符串上使用正则表达式?这对我来说非常方便。

我不能使用 lua 5.3 作为替代品,主要是因为性能问题。Luajit 更快,更适合我使用它的应用程序(咳嗽训练神经网络)

当然,当我需要 string.pack 时,我也需要 string.unpack。

string lua ffi luajit

2
推荐指数
1
解决办法
3703
查看次数

为什么 LuaJIT/Openresty 可以使用已弃用的“arg”语言功能?

我的理解是LuaJIT使用Lua 5.1语法。在 Lua 5.1 中,“arg”功能已从语言中删除。

但是,以下代码可以工作。

// test.lua
local function foo()
  for k,v in pairs(arg) do
    print(k .. " " .. v)
  end
end

foo()
Run Code Online (Sandbox Code Playgroud)

我预计arg为零,但它存在并且正在执行 Lua 5.0 功能。

运行resty test.lua hello world结果为:

0 test.lua
1 hello
2 world
-1 /usr/local/bin/resty
Run Code Online (Sandbox Code Playgroud)

为什么这有效?Openresty 和 LuaJIT 可以使用的 5.1 语法是否有例外?

lua luajit openresty

2
推荐指数
1
解决办法
300
查看次数

为什么下面的Lua代码完全有效?

根据我对Lua的了解(并根据我在Lua手册中所读的内容),我一直给人的印象是Lua中的标识符仅限于AZ&az&_&digits(并且不能开始使用数字,也不能保留关键字,即local local = 123)。

现在,我遇到了一些(混淆的)Lua程序,该程序使用各种奇怪的字符作为标识符:

https://i.imgur.com/HPLKMxp.png

-- Most likely, copy+paste won't work. Download the file from https://tknk.io/7HHZ
print(_VERSION .. " " .. (jit and "JIT" or "non-JIT"))

local T = {}

T.math = T.math or {}
T.math.?»?​â®â€‹â?â®â€‹­?»?â€?‭⎭ = math.sin
T.math.â¬â€‹â­â¬â­â«â®â€­â€¬ = math.cos

for k, v in pairs(T.math) do print(k, v) end
Run Code Online (Sandbox Code Playgroud)

输出:

Lua 5.1 JIT的
“功能”:builtin#45
????? ▲功能:内建#44

我不清楚,为什么标识符允许使用这组字符?
换句话说,为什么它是一个完全有效的Lua程序?

lua luajit

2
推荐指数
1
解决办法
110
查看次数