15

一緒にリンクしたい 2 つのプロジェクトがあるとします。

  • Visual C++ で DLL ファイルにコンパイルされた C++ ライブラリ。
  • ライブラリ内のクラスを使用する C++ Builder でコンパイルされた C++ 実行可能ファイル。

標準の C++ ABI はなく、これら 2 つの C++ プロジェクトを直接リンクしようとしても失敗することを認識しています。これを実現できる互換性レイヤーを作成する自動化された優れた方法は何ですか?

たとえば、C++ ライブラリが C インターフェイスを介して公開される可能性があります。次に、実行可能ファイルには、C++ ライブラリによって公開された C インターフェイスをラップするいくつかの C++ クラスが含まれます。C には標準の ABIあるので、それは機能します。

唯一の問題は、C インターフェイスと C++ ラッパー クラスを自動的に作成する方法です。これを手動で維持することはできません。SWIG プロジェクトは有望に見えますが、残念ながら、C++ は SWIG の Web サイトにリストされているプロジェクトの 1 つではありません。SWIGでやりたいことをする方法はありますか? または、SWIG 以外に、この作業に役立つ別のプロジェクトはありますか?

それとも、これについて間違った方法で行っていますか?

編集: コア C++ ライブラリは、クロスプラットフォームであることを意図しています。実行可能ファイルは、明らかに Windows 固有です。他のプラットフォームでコンパイルできなくなるほどコア ライブラリを汚染したくありません。

4

5 に答える 5

5

Windows でのみ実行する必要がある場合は、クラスを COM オブジェクトとして公開します。これらは引き続き DLL 内にあり、COM を理解する任意の言語で使用できます。

于 2012-08-20T15:17:23.867 に答える
4

Windows でこれを行う "標準的な" 方法は、COM オブジェクトを使用することです。したがって、それは確かに検討するのに適したオプションです。Linux システムでは、モジュールの対話モデル (実行可能ファイルと DLL の対話など) が大きく異なり、C++ 用の ABI が存在します。

これを手動で行う場合 (独自の COM ライクなライブラリを作成する場合) は、多くの小さなトリッキーな問題を真剣に考えると、大変な作業になる可能性があります。クロスモジュール RTTI システム、インターフェイス クエリ/定義プロトコル、モジュール間でメモリを管理する何らかのメカニズムなどが必要になります。さらに、それを「自動化」するには、おそらく MACRO とテンプレートのメタ関数。

モジュール間の「接着剤」として Boost.Python と Python 言語を使用することを強くお勧めします。Boost.Python ライブラリは、基本的に「クラスの自動エクスポート/インポート」全体を行いますが、C++ クラスと関数を Python クラスと関数としてエクスポートします。また、完全に非侵入型でクロスプラットフォームであるため、これは自動エクスポートの理想的な例です。そのため、Python を使用して高レベルのグルー コードを記述するか、Python を C++ モジュール間の中間として使用するか、Boost.Python ライブラリを作り直して、「自動エクスポート」メカニズムのみを使用して任意のインターフェイスにエクスポートすることを検討してください。あなたが設計または使用するシステム。

他にも同様のライブラリがたくさんあると思います。しかし、一番の問題はもちろん、これが本当に必要なのかということです。ハエを殺すためにバズーカを使用している可能性があります。

于 2012-08-20T15:37:49.647 に答える
0

ライブラリを C++ ビルダーでもコンパイルしないのはなぜですか?

于 2012-08-20T15:37:23.693 に答える
0

swig を見回す (swig は C++ を C でラップできるはずだとわかっていた): SWIG と C++

于 2012-08-20T15:39:30.833 に答える