【问题标题】:Unable to dynamically load a library in Lua with package.loadlib无法使用 package.loadlib 在 Lua 中动态加载库
【发布时间】:2011-11-14 05:49:31
【问题描述】:

我正在尝试创建一个库,我可以使用requirepackage.loadlib 将其加载到 Lua 中,但到目前为止我还没有成功。库本身是 C++ 的,但据我所知,我已经采取了必要的步骤来正确导出函数以加载库。简而言之,这是我的 C/C++ 代码的相关部分:

extern "C"
{

// This line is copied from http://gcc.gnu.org/wiki/Visibility
// it's actually in a header, including it here for brevity
#define EXPORT __attribute__((visibility("default")))

EXPORT int luaopen_foo(lua_State* L)
{
    luaL_register(L, "Foo", fooL_table);
    return 0;
}

}

在我的 Lua 脚本中,我有这个:

mylib = package.loadlib("libfoo.so", "luaopen_foo")
print(mylib) -- prints "nil"

该库是从 CMake 生成的 Makefile 创建的,在 CMakeLists.txt 中我尝试使用各种选项进行编译,例如

add_library(foo STATIC ${foo_SOURCES})
add_library(foo MODULE ${foo_SOURCES})
add_library(foo SHARED ${foo_SOURCES})

而且这些选项似乎都不起作用。

我是否缺少任何步骤来完成这项工作?我很难找到有关如何在网上正确执行此操作的信息,因此欢迎提供任何指导。我使用的是带有 gcc 的 Ubuntu 进行编译。

【问题讨论】:

    标签: c++ c binding lua


    【解决方案1】:

    在 Lua 手册中,它说,“libname 必须是 C 库的完整文件名,包括必要时的路径和扩展名。”您的 .so 文件是否在该目录中,具有该名称?

    【讨论】:

    • 我尝试过诸如“foo”“libfoo.so”(或使用共享库时的“libfoo.a”)之类的变体。但是,我刚刚尝试了“./libfoo.so”,它看起来很有效。我不知道为什么我以前没想过尝试。
    • 谢谢,./ 也解决了我的问题:) 即使我先尝试了绝对路径。
    猜你喜欢
    • 2012-01-26
    • 2015-10-22
    • 2019-04-03
    • 2016-08-25
    • 2017-03-03
    • 2017-07-29
    • 2019-01-03
    • 2019-07-30
    • 2018-07-30
    相关资源
    最近更新 更多