1

私が書いている lua プラグインで、次のメッセージのように、lua ランタイムの 2 つのコピーにリンクすることを示すエラーが表示されます: http://lua-users.org/lists/lua-l/2008- 01/msg00671.html

見積もり:

これは、ダミーノードの等価性テストが失敗していることを意味します。これは、Lua コアの 2 つのコピーをアプリケーションにリンクした場合によくある症状です (ダミーノードの 2 つのインスタンスが表示されます)。

一般的なエラーは、C 拡張モジュール (共有ライブラリ) を静的ライブラリにリンクすることです。拡張モジュールのリンカ コマンド ラインには、-llua などを含めてはなりません。

Lua コア シンボル (lua_insert() など) は、Lua コア自体を含む実行可能ファイルからのみエクスポートされます。その後ロードされたすべての C 拡張モジュールは、これらのシンボルにアクセスできます。ELF システムでは、これがリンカー行の -Wl,-E です。すべての非静的シンボルがエクスポートされるため、MACH-O システムではこれは必要ありません。

これはまさに私が見ているエラーです...私が知らないのは、代わりに何をすべきかです。

lua プラグインの c コンポーネントである DLL のインクルード パスに lua src ディレクトリを追加しましたが、リンクすると次のようなエラーが山積みになります。

Creating library file: libmo.dll.a
CMakeFiles/moshared.dir/objects.a(LTools.c.obj): In function `moLTools_dump':
d:/projects/mo-pong/deps/mo/src/mo/lua/LTools.c:38: undefined reference to `lua_gettop'
d:/projects/mo-pong/deps/mo/src/mo/lua/LTools.c:47: undefined reference to `lua_type'
d:/projects/mo-pong/deps/mo/src/mo/lua/LTools.c:48: undefined reference to `lua_typename'
d:/projects/mo-pong/deps/mo/src/mo/lua/LTools.c:49: undefined reference to `lua_tolstring'

要約すると、私はこのような状況にあります:

  1. lua ランタイムに静的にリンクされている親バイナリ。

  2. C コードを含む DLL をロードする lua ライブラリ。

  3. DLL 内の C コードは、lua c API (例: lua_gettop()) を呼び出す必要があります。

どうすればそれをリンクできますか? 確かに、動的ライブラリは親バイナリのシンボルを「見る」ことができません。親バイナリは DLL からシンボルをロードしていないため、静的にリンクされているためです。

...しかし、プラグインの一部としてシンボルをリンクすると、上記のエラーが発生します。

ヘルプ?これは多く発生するはずの問題のように思えます (dll は親バイナリのシンボルに依存します。どのようにリンクしますか?) が、それに関する有用なスレッドが見当たらないようです。

(あなたが尋ねる前に、いいえ、私は親バイナリを制御できず、DLL から lua シンボルをロードすることはできません)

4

1 に答える 1

4

libtoolリンクを簡単にし、移植性を高めるには、これを使用するのがおそらく最善です。-export-dynamic実行可能ファイルは、スタティック ライブラリの Lua シンボルを含むすべてのシンボルをエクスポートするためにリンクする必要があります。次に、モジュールをリンクする必要が-module -shared -avoid-versionあります。Windows の場合は、追加-no-undefinedの ; MacOS の場合は、さらに-no-undefined -flat_namespace -undefined suppress -bundle; Linux と FreeBSD には他のシンボルは必要ありません。これにより、親で満たされた未定義のシンボルがモジュールに残ります。欠落がある場合、モジュールはdlopen親によって編集されません。

セマンティクスは環境ごとにわずかに異なるため、いじる必要がある場合があります。フラグの順序が重要な場合があります。繰り返しlibtoolますが、矛盾の多くを隠すため、推奨されます。

于 2012-07-15T14:53:22.113 に答える