1

いくつかのC++関数(STLを使用)がある場合、C ++コンパイラでコンパイルされていないメイン関数を持つプログラムからそれらを使用できますか?そして、そのプログラムをC ++コンパイラとリンクすることを避けることができますか?

インターフェイスはextern"C"関数である必要があり、例外をスローしてはならないことを認識しています。

Webを検索したところ、それが不可能であることを示唆する多くの情報源が見つかりました。たとえば、次のようになります。

しかし、私もこれを見つけました: http ://wewantarock.wordpress.com/2010/11/01/working-around-the-static-libstdc-restriction/

私はこのように理解しました:回避策は共有ライブラリを構築することです。C ++コンパイラを使用して共有ライブラリをリンクします。共有ライブラリは、一種の「プログラム」そのものです(通常のメイン関数ではなく、DLLMainのようなスタートアップ/ティアダウン関数を使用します)。共有ライブラリを使用するプログラムは、それがC++ライブラリであることを知る必要はありません。

私はそれを正しく理解しましたか?

キャッチはありますか?

編集1:私はそれを試しました-成功しました。libtoolを使って共有ライブラリを構築し、通常のライブラリとリンクして使用できました

cc c_main_program.o -lmy_cpp_library -o c_main_program

実験が成功した後の更新された質問:後で私を驚かせる可能性のあるキャッチはありますか(たとえば、他のプラットフォームで、またはグローバル変数でコンストラクターを使用する場合...)

4

1 に答える 1

2

インターフェイスをエクスポートする限り、内部で STL を使用しても問題はありません。DLL は既にビルドされており、それらを使用するためにリンカーやコンパイラを呼び出す必要はありません。

C++ の問題は、C++ のバイナリ形式が実装依存であるため、異なるコンパイラでビルドされたソース互換コードがバイナリ互換であるという保証がないことです。テンプレートのリンクには別の問題があります。これは、テンプレートのインスタンス化された具象バージョンのみがライブラリに含まれ、コンパイラはテンプレートの定義を確認して、テンプレートを 2 回宣言しないようにする必要があるためです (ほとんどのコンパイラの場合)。

cにはそのような問題はありませんc関数には定義されたインターフェースがあり、データ型のレイアウトもわかっているため、別のコンパイラからの動的ロードは問題ありません。ただし、これは、c の型と機能しか使用できないことを意味します。

より徹底的な議論については、これをチェックしてください

于 2012-10-03T23:20:27.310 に答える