如何创建一个调用c lua-api的lua插件



我在编写的lua插件中遇到错误,这些错误是链接到lua运行时的两个副本的症状,如下消息所示:http://lua-users.org/lists/lua-l/2008-01/msg00671.html

报价:

这反过来意味着对dummynode的平等测试失败了。这是常见的症状,如果你链接了Lua的两个副本核心到应用程序中(导致dummynode的两个实例出现)。

一个常见的错误是链接C扩展模块(共享库)使用静态库。用于扩展的链接器命令行模块不得包含-lua或任何类似内容!

Lua核心符号(Lua_isert()等)从包含Lua核心本身的可执行文件导出。之后加载的所有C扩展模块都可以访问这些符号。在ELF系统下,这就是-Wl、-E在连接线。MACH-O系统不需要这个,因为所有的非静态将导出符号。

这正是我看到的错误。。。我不知道的是我应该做什么。

我已经将lua-src目录添加到DLL的include路径中,DLL是我的lua插件的c组件,但当我链接它时,我会收到一堆错误,比如:

Creating library file: libmo.dll.a
CMakeFiles/moshared.dir/objects.a(LTools.c.obj): In function `moLTools_dump':
d:/projects/mo-pong/deps/mo/src/mo/lua/LTools.c:38: undefined reference to `lua_gettop'
d:/projects/mo-pong/deps/mo/src/mo/lua/LTools.c:47: undefined reference to `lua_type'
d:/projects/mo-pong/deps/mo/src/mo/lua/LTools.c:48: undefined reference to `lua_typename'
d:/projects/mo-pong/deps/mo/src/mo/lua/LTools.c:49: undefined reference to `lua_tolstring'

所以,总的来说,我有这样的情况:

  1. 静态链接到lua运行时的父二进制文件。

  2. 一个加载带有C代码的DLL的lua库。

  3. DLL中的C代码需要调用lua-cAPI(例如lua_gettiop())

我该如何将其联系起来?当然,动态库不能"看到"父二进制文件中的符号,因为父二进制文件不是从DLL加载的,它们是静态链接的。

但如果我把符号作为插件的一部分链接进来,我会得到上面的错误。

帮助?这似乎是一个应该经常出现的问题(dll依赖于父二进制文件中的符号,你如何链接它?)但我似乎看不到任何有用的线程。

(在你问之前,不,我不能控制父二进制文件,也不能让它从DLL加载lua符号)

为此,最好使用libtool,以使链接更容易、更便携。可执行文件需要与-export-dynamic链接才能导出其中的所有符号,包括静态库中的Lua符号。然后,模块需要与-module -shared -avoid-version链接,如果在Windows上,则需要与其他-no-undefined链接;如果在MacOS上,则附加-no-undefined -flat_namespace -undefined suppress -bundle;Linux和FreeBSD不需要其他符号。这将给模块留下未定义的符号,这些符号在父级中得到满足。如果有任何缺失,则该模块将无法被父级dlopen调用。

每个环境的语义都略有不同,因此可能需要一些技巧。有时旗帜的顺序很重要。同样,建议使用libtool,因为它隐藏了大部分不一致性。

最新更新