2016-08-02 2 views
0

Я скомпилировал общую библиотеку для "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 Я не вижу, что этот символ экспортирован. Как это сделать?

+0

Использование 'ldd -r ' и (возможно) 'ldd -d ' вы видите все экспортируемое, как ожидалось? – M4rc

+0

@ M4rc: Я. Или, по крайней мере, я так считаю. Кажется, что все зависимости указывают на правильные каталоги. Я склоняюсь к идее, что он имеет меньше общего с моим общим объектом и больше связан с тем, как я загружаю его в сценарий Lua. Но я открыт для того, чтобы быть некорректным. – marcman

+0

Если вы запустили 'readelf -Ws', вы видите там функцию' init' и 'greet'? AFAIK '_init()' может быть зарезервирован для точки входа C++. – M4rc

ответ

0

Ваш DLL не соответствует формату lua C api DLL. Попробуйте: __declspec (dllexport) int luaopen_liblbtest (lua_State * L) { lua_register (L, "init", init); return 1; }

Смежные вопросы