LuaJit的C库构建

请帮我理解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 构建模式吗?

点赞
用户3677376
用户3677376

解释器需要访问 Lua API,C 扩展模块也需要访问 Lua API,并且两者需要链接到同一个库,否则会发生 _不好的事情_(例如,会有两组静态变量)。

有两种常用的方法来满足这些要求。

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

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

2016-05-03 22:04:17