我已经从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()
(前面列出的零值)时导致了同样的错误 . 有趣的是,最后一个似乎至少返回一个函数 .
我用Lua 5.1.5运行Ubuntu 14.04 .
我如何让它工作?
UPDATE
当我删除'.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 回答
您的C DLL不遵循lua C api DLL的格式 . 请尝试:__ declspec(dllexport)int luaopen_liblbtest(lua_State * L){lua_register(L,“init”,init);返回1; }