mingw环境下编译pbc的lua绑定库protobuf会出怪异现象,引用的skynet里lua5.4版本:
253980289 opened this issue · comments
fastfullstack.com commented
修改protobuf.lua里代码如下:
print("1")
local c1 = require "protobuf.c"
local c = {}
-- c["_env_new"] = function() end
-- print(c._env_new)
-- do return end
for k,v in pairs(c1) do
print(k,v)
local s = string.format("%s", k)
if "_env_new" == s then
print(k, type(k), v, type(v))
c[k] = v
else
print("no _env_new", k, type(k), v, type(v))
end
end
print("for c")
for k,v in pairs(c) do
print(k,v)
end
print("ok", c, c._env_new)
do return end
发现调用c._env_new时会报nil异常,最后定位到是两个字符串内容打印一至,但却不相等,通过string.format复制一份才相等。
其中具体原因看看大家有谁指导下?
云风 commented
- 你可以用 # 求长度看是否一样。format 会阶段 \0 以后的字符,而 lua string 允许包含 \0
- 确保只 link 了唯一一份 lua 库。
fastfullstack.com commented
目前取长度显示均为8:
8 8 _env_new string function: 68141dc0 function
云风 commented
skynet 的 lua 对短字符串处理有异于官方 lua 。你必须确保只 link 了唯一一份 lua 。
fastfullstack.com commented
skynet 的 lua 对短字符串处理有异于官方 lua 。你必须确保只 link 了唯一一份 lua 。
经测试证明是这样原因,用原版lua或者连接时只链接一份skynet里的lua都是ok的
云风 commented
在任何场景下,都不应链接多份 lua ,即使是链接的原版,链接的同一个版本。