Я скомпилировал общую библиотеку для "basic usage" example из документов Luabind. Однако я не могу заставить его позвонить из Луа.Не удается загрузить совместно используемую библиотеку (скомпилированный с C++ и 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. Однако, когда я бегу команды (как описано в this answer)
> 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()
(значение nil, как было указано ранее). Интересно, что последнее, по крайней мере, похоже, возвращает функцию.
Я бегу Ubuntu 14.04 с Lua 5.1.5.
Как я могу заставить это работать?
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
Я не вижу, что этот символ экспортирован. Как это сделать?
Использование 'ldd -r' и (возможно) 'ldd -d ' вы видите все экспортируемое, как ожидалось? –
M4rc
@ M4rc: Я. Или, по крайней мере, я так считаю. Кажется, что все зависимости указывают на правильные каталоги. Я склоняюсь к идее, что он имеет меньше общего с моим общим объектом и больше связан с тем, как я загружаю его в сценарий Lua. Но я открыт для того, чтобы быть некорректным. – marcman
Если вы запустили 'readelf -Ws', вы видите там функцию' init' и 'greet'? AFAIK '_init()' может быть зарезервирован для точки входа C++. – M4rc