0

これは少し複雑ですが、試してみましょう。

LUA スクリプトを自分のゲーム エンジンに統合しています。これは過去に win32 でエレガントな方法で実行しました。win32 では、エクスポート関数として LUA に公開したいすべての関数をマークするだけでした。次に、それらを LUA に統合するために、実行可能ファイルの PE ヘッダーを解析し、名前を解読し、パラメーターなどを解析してから、LUA ランタイムに登録します。これにより、LUA に公開するためだけにすべての関数を個別に手動で登録することを避けることができました。

さて、私が iPhone で作業している今日に目を向けてみましょう。私はいくつかの Unix のものを調べて、同様のアプローチを取ることに非常に近づいてきましたが、実際に機能するかどうかはわかりません。

私は Unix に完全に精通しているわけではありませんが、これまで iPhone で使用していたものを以下に示します。

    ステップ 1: Objective-C を介して実行可能パスを照会し、アプリのパスを取得する
    ステップ 2: dlopen を使用して、次を使用してアプリへのハンドルを取得します: `dlopen(path, RTLD_NOW)`
    ステップ 3: `dlsym( libraryHandle, objectName )` を使用して、既知のシンボルのアドレスを取得しようとします。

上記の手順では、実際に目的の場所に到達することはできませんが、それでもうまくいきません。Unixでこの種のことをした経験のある人はいますか? 正しい軌道に乗せるためにグーグルで検索できるヘッダーや関数はありますか?

ありがとう;)

4

4 に答える 4

3

iPhone は、最初のアプリケーションの起動後の動的リンクをサポートしていません。あなたがやりたいことは、実際には新しいアプリケーション TEXT でリンクする必要はありませんが、dl* 関数の一部が期待どおりに動作しないことを知ってもショックはありません。

プラットフォーム固有のコードを記述できる場合もありますが、リンカー セットと呼ばれるさまざまな BSD によって開発された手法を使用することをお勧めします。基本的に、何かを行いたい関数に注釈を付けます (現在エクスポート用にマークしているのと同じように)。いくつかのプリプロセッサ マジックを使用して、バイナリ イメージの余分なセグメントに注釈を保存し、そのデータを取得して列挙するコードを作成します。したがって、必要なすべての関数をリンカー セットに追加し、リンカー セットを調べて、その中のすべての関数を lua に登録するだけです。

Windows や Linux でこのようなものを実行している人々がいることは知っています。私は Mac OS X やさまざまな *BSD で使用しました。私はFreeBSD の linker_set 実装をリンクしていますが、Windows の実装は個人的に見たことがありません。

于 2008-11-04T19:19:05.780 に答える
0

--export-dynamic(経由で) リンカーに渡す必要があります-Wl,--export-dynamic

注: これは Linux 用ですが、検索の出発点になる可能性があります。

参考文献:

于 2008-11-04T18:39:19.527 に答える
0

静的リンクがオプションの場合は、それをリンカー スクリプトに統合します。リンクする前に、すべてのオブジェクト ファイルに対して "nm" を実行し、グローバル シンボルを抽出して、すべてのシンボル名からシンボル値への (できればソート/ハッシュ化された) マッピングを含む C ファイルを生成します。

  struct symbol{ char*  name; void * value } symbols = [
     {"foo", foo},
     {"bar", bar},
     ...
     {0,0}};

公開するものを厳選したい場合は、命名スキーマを実装するのが最も簡単な場合があります。たとえば、すべての関数/メソッドの前に Lua_ を付けます。

または、単純なマクロを作成することもできます。

   #define ForLua(X) X

次に、ForLua のソースを grep して、組み込みたいシンボルを選択します。

于 2008-11-04T19:35:49.337 に答える
0

mapfile を生成して代わりに使用することもできますよね?

于 2008-11-04T21:04:42.637 に答える