Не удается загрузить пакет общей библиотеки (скомпилированный с C++ и Luabind) в Lua

Я собрал разделяемую библиотеку для примера "базового использования" из документации Luabind. Однако я не могу заставить его позвонить от Луа.

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: попытка вызвать глобальную трассировку стека 'greet' (значение nil): 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() (нулевое значение, как изложено ранее). Интересно, что последний, по крайней мере, возвращает функцию.

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

1 ответ

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

Другие вопросы по тегам