0

何らかの理由で、C++ で記述された共有ライブラリのかなりの数の関数を、正しく呼び出すために C 関数によって「ラップ」する必要があります。さて、このプロセスを自動化できるかどうか疑問に思っています (せいぜい私の CMake-build-process にうまく統合されています)。

例: 関数定義があるとします。

extern "C" void foo(Somestruct myinfo, char const * const data, char const * const data2)

私の.hppファイルで。ここで、この定義を次のように変更します。

C_WRAPPER void foo(Somestruct myinfo, ARG(1) data, ARG(3) data2)

いくつかのマクロを使用すると、これを問題なく元の形式に変換できます。したがって、機能的な観点から hpp ファイルは変更されません。

一部のパーサーは、このファイルを読み取り、(たとえば) を含む新しい c ファイルを生成する必要があります。

extern void foo(Somestruct myinfo, char const * const, char const*const);
void foo_wrapper(Array everything) {
     char * data1 = fromArray(array, 1);
     char * data3 = fromArray(arary, 3);
     foo(fromArray(0), data1, data3);
}

境界条件: 一般的なレイアウトは常に同じに見えます。唯一の違いは、 の数ARGが必ず一定であることです。の引数はARG、データが配置されている配列内の位置を示します。

現在、ラッパー ファイルは手動で作成されているため、過去のインターフェイスの変更により、時間のかかるエラーが発生しました。それが、このステップを自動化したい理由です。

自分でパーサーを作成せずに、このようなものをアーカイブする方法を知っていますか? 前述のように、CMake を使用した私のビルド プロセスにうまく適合するものが望ましいです。

4

1 に答える 1

1

私自身の質問に答えることができて光栄です。CMake で完全に実行できます。

funcstringここでは、すべてのラッパー関数を含む変数を埋める CMake スクリプトのみを示します。典型的な構成ファイルを使用して、これらの文字列をラッパー関数に書き込むことができます。

set(sources a.cpp)

foreach(source ${sources})
    file(READ ${source} contents)

    foreach(var IN ITEMS ${contents})
        string(REGEX MATCH "C_WRAPPER[ ]+[a-zA-Z0-9]+[(].*[)]" wrapperfun ${var})

        if(wrapperfun)
        string(REGEX REPLACE "C_WRAPPER[ ]+\([a-zA-Z0-9]+\)[(].*[)]" "\\1" function_name ${wrapperfun})

        string(REGEX MATCHALL "ARG[(][0-9]+[)]" args ${wrapperfun})

        set(lines "")
        set(funcargs "")
        foreach(arg ${args})
            string(REGEX MATCH "[0-9]+" num ${arg})
            set(lines "${lines}
                char * data${num} = fromArray(array, ${num})\;")
            set(funcargs "${funcargs}, arg${num})")
        endforeach(arg)

        set(funcstring "
            ${wrapperfun}\;
            Datum ${function_name}_wrapper(Array everything) {
                ${lines}
                return ${function_name}(fromArray(0), ${funcargs})\;
            }

        ")

        endif()    

    endforeach(var)
endforeach(source)

マクロは置き換えられていません - これは CMake で行うことができますが、最終的な C ファイルに適切なマクロ定義を含める方が短くて簡単です。

于 2013-01-02T20:33:07.657 に答える