【问题标题】:C library build for LuaJitLuaJit 的 C 库构建
【发布时间】:2016-04-30 18:50:09
【问题描述】:

请帮助我了解 luajit 的构建过程。

如果我想编译一个 c 库,我使用以下代码:

gcc -shared -fpic -O -I/path-to-luajit-headers/luajit-2.1  mylib.c -o mylib.so

是否需要像这样使用更具体的参数:

gcc -shared -fpic -O -I/path-to-luajit-headers/luajit-2.1 -L/path-to-luajit/lib mylib.c -o mylib.so -lluajit-2.1

在第二种情况下,.so 文件比第一种大两倍。有什么不同?使用-lluajit-2.1等重要吗?可能有更多的参数来定义luajit模式而不是纯lua构建模式?

【问题讨论】:

  • 你真的在 mylib.c 中使用了 Lua(JIT) 中的任何东西吗?如果你这样做了,那么第一行应该会因为几个未定义的引用错误而失败,因为链接器应该无法找到 Lua(JIT) 符号。
  • @ColonelThirtyTwo ,使用这两个命令编译库。

标签: lua compilation luajit


【解决方案1】:

解释器需要访问 Lua API,C 扩展模块需要访问 Lua API,两者都需要链接到同一个库,否则会发生坏事(例如是两组静态变量)。

有两种常见的方法可以实现这些要求。

  1. 将 Lua API 编译为共享库/DLL,并将解释器和扩展模块链接到此共享库。这是在 Windows 上采用的方法。
  2. 将 Lua API 编译为静态库并将其链接到解释器,但请确保解释器重新导出 Lua API。这样,扩展模块在加载时就可以访问。这是 Unix 平台上通常采用的方法。在构建解释器时,它需要 -Wl,-E 链接器标志。

由于您似乎运行的是 Unixoid 操作系统,因此您的第一种方法可能是正确的(因为您的解释器可能已经重新导出了 Lua API),而第二种方法将在 Lua API 中链接两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多