根据以下消息,我正在编写的 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 目录添加到 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'
所以,总而言之,我有这种情况:
静态链接到 lua 运行时的父二进制文件。
一个 lua 库,它加载一个带有 C 代码的 DLL。
DLL中的C代码需要调用lua c api(如lua_gettop())
我该如何链接?当然,动态库不能“看到”父二进制文件中的符号,因为父二进制文件不是从 DLL 加载它们,它们是静态链接的。
...但是如果我将符号作为插件的一部分链接,我会收到上面的错误。
帮助?这似乎是一个应该经常出现的问题(dll 依赖于父二进制文件中的符号,你如何链接它?)但我似乎看不到任何有用的线程。
(在你问之前,不,我无法控制父二进制文件,我无法让它从 DLL 加载 lua 符号)