cloudwu / pbc

A protocol buffers library for C

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

mingw环境下编译pbc的lua绑定库protobuf会出怪异现象,引用的skynet里lua5.4版本:

253980289 opened this issue · comments

修改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复制一份才相等。
其中具体原因看看大家有谁指导下?

  1. 你可以用 # 求长度看是否一样。format 会阶段 \0 以后的字符,而 lua string 允许包含 \0
  2. 确保只 link 了唯一一份 lua 库。

目前取长度显示均为8:
8 8 _env_new string function: 68141dc0 function

skynet 的 lua 对短字符串处理有异于官方 lua 。你必须确保只 link 了唯一一份 lua 。

skynet 的 lua 对短字符串处理有异于官方 lua 。你必须确保只 link 了唯一一份 lua 。

经测试证明是这样原因,用原版lua或者连接时只链接一份skynet里的lua都是ok的

在任何场景下,都不应链接多份 lua ,即使是链接的原版,链接的同一个版本。