ホームページ > バックエンド開発 > C++ > std:: オブジェクトを含むクラスを DLL からエクスポートするにはどうすればよいですか?

std:: オブジェクトを含むクラスを DLL からエクスポートするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-16 18:52:03
オリジナル
665 人が閲覧しました

How to Export Classes Containing std:: Objects from a DLL?

std:: オブジェクトを含むクラスを DLL からエクスポートする

std::vectors や std::strings などのオブジェクトを含むクラスを DLL からエクスポートする場合DLL、「クラス」などの警告'std::map<_Kty,_Ty>'クラス「FontManager」のクライアントによって使用される dll インターフェイスが必要です」という問題が発生する可能性があります。この警告は、クラスのメンバー型がクライアント コードからアクセスできるようにするために DLL インターフェイスが必要であることを示します。

標準コンテナの前方宣言

この問題を解決するには、次のようにします。 DLL_EXPORT を使用したクラス宣言は、以下に示すようにメンバー変数の前に配置できます。

template class DLL_EXPORT std::allocator<tCharGlyphProviderRef>;
template class DLL_EXPORT std::vector<tCharGlyphProviderRef,std::allocator<tCharGlyphProviderRef> >;
std::vector<tCharGlyphProviderRef> m_glyphProviders;
ログイン後にコピー

このアプローチでは、警告は削除される可能性がありますが、メンバー関数の DLL インターフェイスの可用性は保証されません。

DLL インターフェイスの要件

適切な DLL 機能、クラス、およびそのメンバー関数を確保するにはDLLインターフェイスが必要です。これは、コンパイラが DLL 自体内で関数を生成し、インポート可能にすることを意味します。クライアント コードからアクセスできるメンバーにこのインターフェイスを提供しないと、コンパイルまたはリンク中に警告またはエラーが発生します。

プライベート メンバーと警告

クライアントはプライベート メンバーにアクセスできませんDLL_EXPORT 宣言から除外できます。このようなメンバーに対する警告は無効にすることができます。ただし、コンパイラで生成されたデストラクターとコンストラクターには注意が必要です。

Dll エクスポート可能なメンバーの処理

クライアントが使用する必要があるメンバーには、次のいずれかが必要です。

  • Dll エクスポート ラッパー: 作成メンバーに対する操作を実行する DLL からエクスポートされたサロゲート関数。
  • 間接メソッド: メンバーに間接を提供するメソッドを実装し、代わりにこれらのメソッドをエクスポートします。
  • PIMPL イディオム: プライベート実装 (PIMPL) イディオムを使用して、メンバーの外部可視性を減らします。

テンプレート クラスのインスタンス化

DLL_EXPORT を使用したテンプレート クラスの前方宣言は、現在のコンパイル単位内でのみインスタンス化を作成します。このアプローチは、テンプレート以外のクラスには不十分です。

以上がstd:: オブジェクトを含むクラスを DLL からエクスポートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート