2016-08-02 27 views
0

Luabindドキュメントから"basic usage" exampleの共有ライブラリをコンパイルしました。しかし、私はそれをルアから呼び出すことはできません。共有ライブラリ(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してコンパイルします。私はいくつかのテストを試してみました

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のすべて(this answerで説明したように)私は、コマンドを実行したときただし、

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

私はこのエラーを取得しますgreet()(前述のnilの値)を呼び出す際に、同じエラーが発生しました。最後の関数が少なくとも関数を返すように見えるのは面白いです。

私はLua 5.1.5でUbuntu 14.04を実行しています。

これを動作させるにはどうすればよいですか?


私は '.soの' 接尾辞を落とし、(this Lua mailing list conversationあたりとして)require構文を使用し始めたときに別のエラーを取得するために管理したUPDATE

> 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

あなたのC DLLは、C言語のAPI DLLのフォーマットに従いません。試してみてください: __declspec(dllexport)int luaopen_liblbtest(lua_State * L) { lua_register(L、 "init"、init); リターン1; }

関連する問題