前提:我希望我的C++应用程序不依赖于任何东西Microsoft Visual C++ redistributable,所以我可以发送可以开箱即用的可执行文件.
什么我先做:运行时库切换到Multithread (/MT)从DLL Multithread (/MD)以避免需要msvcr110.dll(?,不应该VS 2013需要120版本,因为它是编译器版本).为此,我还必须使用相同的运行时库重新编译我正在使用的另一个库,这样才有效.我的.exe可以在任何地方运行而没有问题(或者我不知道,哈哈).
然后我添加了一些使用LuaJIT的功能.我已经通过msvcbuild.bat提供的包构建了LuaJIT ,它就像一个魅力,但现在我的可执行文件需要msvcr110.dll运行.我想这是因为LuaJIT是用/ MD标志编译的,但我想知道是否有一种正确的方法来做我想要的.
我正在写一个Lua字节码解释器,我正在尝试在LuaJIT和luac之间做出决定来生成初始字节码.因为我正在编写一个解释器,所以我不会得到任何JIT性能,所以这一切都取决于编译器的质量和生成的字节码的设计.
是否要么编译器明显更好?
我在Dart(也是解释)中写这个,所以我们赞赏编译器的任何免费优化.
我想在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对我来说仍然是一个新鲜事物.
所以首先我加载一个我需要的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?
所以,我只是想知道使用普通的Lua解释器而不是LuaJIT解释器是否有任何优势?
为什么这个语法有效:
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编写的配置文件解析器.
我想检测作为环境变量的值并使用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 浮点数列表并将其附加到一个字符串。我知道 Lua 5.3 存在 string.pack 但我仅限于 Luajit。我对 FFI 不太熟悉,如果它有解决方案,我将不胜感激使用它的帮助(使用 tostring(number) 只是使用了太多的数字字节,并且内存有限)
基本上,我需要一种方法来使用 Luajit 获取数字列表(现在为浮点数)的二进制字符串打包形式,并能够将其存储在字符串中并将该字符串连接到另一个字符串,甚至在其后面写入内容(我在 5.3 中遇到了这个问题,所以不确定您在下面向我建议的任何解决方案是否可行)
另外,如果操作正确,我是否可以在获得的字符串上使用正则表达式?这对我来说非常方便。
我不能使用 lua 5.3 作为替代品,主要是因为性能问题。Luajit 更快,更适合我使用它的应用程序(咳嗽训练神经网络)
当然,当我需要 string.pack 时,我也需要 string.unpack。
我的理解是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的了解(并根据我在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程序?