4

純粋仮想関数が DLL からエクスポートされないという奇妙な問題が発生しています。DLL がコンパイルされ、.dll ファイルとしてディレクトリに出力されます。ただし、.lib ファイルは生成されません。

私が定義を与え、それがもはや純粋な仮想として remian しなくなった場合、その後、喜んで .lib ファイルを作成します。

インターフェイスと実装を分離する必要があるファクトリ パターンを実装する必要があります。私のファクトリ実装と、必要な.dll(.libファイルが生成されていない)を使用する他のインターフェースは、そのエクスポートされた関数を使用する必要があり、それらの関数を使用するとリンクエラーが発生します...

「エラー LNK2011: 未解決の外部シンボル "public:......." など

純粋仮想関数をエクスポートして、他のexeおよびdllに実装できるようにする方法を考えてください

よろしくウスマン

4

3 に答える 3

8

次のリンクはあなたの疑問を明確にします

C++ クラスでの dllimport と dllexport の使用

仮想/インライン関数のみでクラスをエクスポートする必要はありません

于 2010-10-02T13:46:32.993 に答える
8

DLL から何かをエクスポートすると、その DLL 内の具体的な何か (定義済みの関数またはクラス) の外部から見える名前が作成されます。これがないと、プロジェクト (その DLL を参照するプロジェクト) をインポートするためのリンク手順で、エクスポートする DLL 内の関数とクラスへのすべての必要な参照を解決できません。

純粋仮想関数の場合、エクスポートする DLL に具体的な「もの」はありません。純粋仮想関数への外部呼び出しを解決するためのリンク可能な名前は存在できません。存在する場合、定義により純粋ではありません。この場合、必要なのはコンパイル時にアクセス可能な純粋仮想関数のヘッダー ファイルでの宣言だけです。これにより、インポートする EXE または DLL は具体的な関数でそれをオーバーライドする方法を知ることができます。

于 2010-10-02T13:57:27.050 に答える
1

C++ では、純粋仮想メソッドを定義できます。例えば:

// T.hpp
class T
{
   public :
      virtual void doSomething() = 0 ;
      // etc.
} ;

.

// T.cpp
void T::doSomething()
{
}

// etc.

これで、dllexport/dllimport 指定子が T クラスに追加され、doSomethingメソッドがエクスポートされます。

純粋仮想メソッドの本体を定義するポイントは、デフォルトの実装を提供しながら、ユーザーがメソッドをオーバーライドできるようにすることでした。

このパターンの私自身の使用法は、何らかの理由で仮想メソッドが存在する前に呼び出されたとき、または仮想メソッドが存在しなくなったとき (つまり、基本抽象クラスのコンストラクターまたはデストラクター内) にクラッシュを回避することです。デバッグ モードでは、デバッガー ( ::DebugBreak()Win32 API 関数) を起動し、リリース モードでは何もしません。

ただし、純粋仮想関数を本当にエクスポートする必要がある場合は、このパターンを使用して問題を解決することもできます。

于 2010-10-02T15:55:06.807 に答える