2017-02-17 7 views
2

私はプロジェクトのソースコードをいくつか読んでいます。これはC++とluaの組み合わせで、luabindでつながっています。対話型端末のC++/luaプロジェクトのluaファイルから関数を呼び出す方法は?

la.luaファイルがあり、そこには関数exec(arg)があります。それが今、私は(Linux上)対話型端末からla.exec()を実行したいが、私は得る最初

module(..., package.seeall); 
print("Loading "..debug.getinfo(1).source.."...") 
require "client_config" 

に以下のように文を持っているので、LUAファイルも、他のLUAファイルから関数/変数を使用しています私はla.luaをインポートする場合

attempt to index global 'lg' (a nil value) 

のようなエラーが、私は何ができる

require "la" 
Loading @./la.lua... 
./la.lua:68: attempt to index global 'ld' (a nil value) 
stack traceback: 
./lg.lua:68: in main chunk 
[C]: in function 'require' 
stdin:1: in main chunk 
[C]: ? 

を取得しますか?

+0

これを修正しました。 './la.lua:68:グローバル 'ld'(ゼロ値)のインデックスを作成しよう ' – moteus

+0

@moteus問題を解決する方法は? – Lily

+0

「la.lua」なしでは言い難い。 – moteus

答えて

0

どうしたのですか?

一つのオプションは、ファイルが、それが依存しませ適切requireすべてのことを行うので、あなたが不足している依存関係だということです(本当に一般的な当て推量は以下では、...あなたが提供するものに多くの情報がありません)。 (もしAが& requireのBに続いてCに依存し、CはBに依存しますが、requireはそれが暗黙的にAによってロードされていないので、直接ロードするCは失敗します。)&の依存関係を物事が突然動くことがあります。

(ただし、モジュールは、これはリストラの多くなしには不可能かもしれ書かれている方法に応じて。あなたが設定する例として、しない限り、package.loaded["foo"]fooのモジュールテーブルにfooでロードsubmdules、これらのサブモジュールはできないrequire"foo"。(幸いにも、modulemoduleトンせずに、新しいコードでは、それを行います彼らはにロードして、物事を「固定」しながら、さらに...)他のモジュールをロードし、ロードfoo他のモジュールをロードし、その後、あなたは(スタックオーバーフローまで)無限ループを得るでしょうfooの - 帽子のしばしば忘れ通常の操作でプログラム/ライブラリで使用されている読み込み順序を誤って壊す可能性があります。通常は、プログラム/ライブラリを通常通りに実行しようとするまで気付かないでしょう。したがって、依存関係を修正するには時間がかかるだけです。あなたははまだ長いlua -lfoo-lbar物事を実行するために得るかもしれないが、それに依存しないワンオフ依存関係リスト。)

別を構築するのに十分な追跡することができるかもしれませんC(++)モジュールによって提供された部品が不足しています。これらがLuaライブラリのスタイルで書かれている場合(すなわち、luaopen_FOOを持っている場合)、それらはインタプリタに読み込まれる可能性があります。(IIRCはメインプログラムがC++対応であると期待しているのでC++にはあり得ませんが、luaは(普通は?常に?)プレーンCです)。これらのモジュールはそうではなく、他の方法。さらに別の可能性は、メインプログラムが、それが作成するLua状態にあるをあらかじめ定義していることです。つまり、それらのものを得るためにロードできるモジュールはありません。


上記にはいくつかバリエーションがありますが、これらはすべて一般的なカテゴリである必要があります。あなたの問題が最初のものであると思われる場合(単なる依存関係情報がありません)、おそらくそれを稼働させるかなり良い機会があるので、これにもう少し時間をかけてください。あなたがそれが後者の2つの1つであると思われるならば、あなたがそれを(少なくとも直接ではなく)働かせないという非常に高い可能性があります。

REPLを開くためにプログラムにパッチを当てて、そこからやりたいことを何でもして、問題を解決することができます。 (最も簡単な方法はdebug.debug()です)実際には制限されていますが(暗黙的なreturn、間違ったエラー情報はありません)、本当に限られていますが、何か改善が必要な場合は、通常のLua REPLのようにLuaの〜30行程度で)。

関連する問題