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

时间:2016-08-02 05:24:54

标签: c++ lua luabind

我已经从Luabind文档编译了"basic usage" example的共享库。但是,我无法从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。但是,当我运行命令时(如this answer中所述)

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

我收到此错误:

  

stdin:1:尝试调用全局'greet'(零值)堆栈回溯:   stdin:1:在主要块[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()时导致了同样的错误(前面列出的nil值)。有趣的是,最后一个似乎至少会返回一个函数。

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

我如何让它工作?

更新

当我删除'.so'后缀并开始使用require语法(根据this Lua mailing list conversation

时,我确实遇到了不同的错误
> 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命令我看不到导出的符号。我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

您的C DLL不遵循lua C api DLL的格式。请试试:     __declspec(dllexport)int luaopen_liblbtest(lua_State * L)     {         lua_register(L,&#34; init&#34;,init);         返回1;     }

相关问题