在 Lua 中,C 包是从 CPATH 加载的本机代码库。有两种类型的库可以动态加载:共享库和模块。区别在于共享库可以链接,而模块则不能。两种类型的动态加载方面相似,因此两者都将使用 Lua 加载相同的内容。
在 PiL 中,建议 应使用共享库。本章甚至多次提到“动态链接”,但在我看来,它应该是“动态加载”。我是不是误解了这一章?
不幸的是,我在 PiL 中找不到任何关于如何正确构建 C 包的明确答案。对我来说,它们似乎应该被编译为模块而不是共享库,因为它们不应该被链接。这个假设正确吗?
我首先开始研究这一点是因为在 macOS 上共享库必须具有
.dylib
扩展名,而模块(或 macOS 术语中的“捆绑包”),可以具有 any 扩展名,这是移植软件中非常常见的做法使用 .so
扩展名(例如,CMake 在面向 macOS 时默认为 CMAKE_SHARED_LIBRARY_SUFFIX=.dylib
和 CMAKE_SHARED_MODULE_SUFFIX=.so
)。 macOS 上的 Lua 将仅尝试使用默认 CPATH 加载具有 .so
扩展名的库。
您阅读的 PiL 书是为 Lua 5.0 编写的第一版。在新版本(第 4 版)中,术语“C Packages”已更改为“C Modules”。所以答案已经很明确了。
另外,书中还提供了package的定义:
从 5.1 版本开始,Lua 为模块和包定义了一组策略(包是模块的集合)。