无法将用 C++ 和 Luabind 编译的共享库包加载到 Lua 中

我已经编译了来自 Luabind 文档中"基本用法" 的例子的共享库。然而,我无法从 Lua 中调用它。

lbtest.cpp

extern "C"
{
    #include "lua.h"
}
#include <iostream>
#include <luabind/luabind.hpp>

void greet()
{
    std::cout << "hello world!\n";
}

extern "C" int init(lua_State* L)
{
    using namespace luabind;

    open(L);

    module(L)
    [
        def("greet", &greet)
    ];

    return 0;
}

这将被编译为 liblbtest.so。 但是,当我运行以下命令(如此答案中所述)时:

> lua
> package.loadlib('liblbtest.so', 'init')()
> greet()

我会得到以下错误:

stdin:1: attempt to call global 'greet' (a nil value) stack traceback: stdin:1: in main chunk [C]: ?

我进行了一些测试:

> fn, err = package.loadlib('liblbtest.so', 'init')
> print(fn)
nil

> fn, err = package.loadlib('liblbtest.so', 'init')()
stdin:1: attempt to call a nil value
stack traceback:
    stdin:1: in main chunk
    [C]: ?

> fn, err = package.loadlib('liblbtest.so', '_init')()
> print(fn)
nil

> fn, err = package.loadlib('liblbtest.so', '_init')
> print(fn)
function 0x1332e90

所有这些loadlib调用导致相同的调用greet()的错误(正如之前所述的,空值)。有趣的是,最后一个似乎至少返回了一个函数。

我正在运行 Ubuntu 14.04,使用的是 Lua 5.1.5。

我该如何使其正常工作?


更新

当我放弃了'.so'后缀并开始使用 require 语法(根据此 Lua 邮件列表对话)时,我确实得到了不同的错误

> require('liblbtest')
error loading module 'liblbtest' from file './liblbtest.so':
    ./liblbtest.so: undefined symbol: luaopen_liblbtest
stack traceback:
    [C]: at 0x0047aff0
    [C]: in function 'require'
    stdin:1: in main chunk
    [C]: at 0x00406670

但是,使用 nm -gC liblbtest.so 命令,我没有看到导出该符号。 我该怎么做?

点赞
用户6473899
用户6473899

你的 C DLL 没有遵循 lua C api DLL 的格式。请尝试:

__declspec(dllexport) int luaopen_liblbtest(lua_State* L)
{
    lua_register(L, "init", init);
    return 1;
}
2017-05-25 07:01:23