【问题标题】:How do you create a lua plugin that calls the c lua api?如何创建一个调用 c lua api 的 lua 插件?
【发布时间】:2012-07-14 14:03:17
【问题描述】:

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

引用:

这又意味着 dummynode 的相等性测试失败。 这是常见的症状,如果你链接了 Lua 的两个副本 核心进入您的应用程序(导致 dummynode 的两个实例 出现)。

一个常见的错误是链接 C 扩展模块(共享库) 与静态库。用于扩展的链接器命令行 模块不得包含 -llua 或类似的东西!

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

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

我已将 lua src 目录添加到作为我的 lua 插件的 c 组件的 DLL 的包含路径中,但是当我链接它时,我得到了一堆错误,例如:

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. 一个 lua 库,用于加载包含 C 代码的 DLL。

  3. DLL中的C代码需要调用lua c api(如lua_gettop())

如何链接?当然,动态库不能“看到”父二进制文件中的符号,因为父二进制文件不是从 DLL 加载它们,它们是静态链接的。

...但是如果我将符号作为插件的一部分链接,则会出现上述错误。

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

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

【问题讨论】:

    标签: c lua


    【解决方案1】:

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

    每个环境的语义略有不同,因此可能需要一些摆弄。有时标志的顺序很重要。同样,推荐libtool,因为它隐藏了很多不一致之处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-25
      • 2017-07-16
      • 2015-07-14
      • 2010-12-10
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 2018-12-11
      相关资源
      最近更新 更多