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
コマンドを使用していますが、そのシンボルがエクスポートされていません。それはどうしたらいいのですか?
'ldd -r'と(おそらく) 'ldd -d 'を使用すると、すべてが期待通りにエクスポートされていますか? –
M4rc
@ M4rc:そうです。または少なくとも私はそう信じています。依存関係はすべて、正しいディレクトリを指すように見えます。私はそれが私の共有オブジェクトとはあまり関係がなく、それをLuaスクリプトにどのようにロードするかともっと関係があるという考えに傾いています。しかし、私は間違っていることに気をつけています – marcman
'readelf -Ws'を実行すると' init'関数と 'greet'関数がそこにありますか? AFAIK '_init()'はC++のエントリーポイント用に予約されているかもしれません。 – M4rc