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

时间:2012-07-15 13:10:58

标签: c lua

我正在编写的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'

总而言之,我有这种情况:

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

  2. 一个lua库,用于加载包含C代码的DLL。

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

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

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

    帮助?这似乎是一个问题,应该会出现很多(dll取决于父二进制中的符号,你如何链接它?)但我似乎无法看到任何有用的线程。

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

1 个答案:

答案 0 :(得分:4)

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

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