11

からエクスポートされone.dllたクラスを使用するDLL があります。forを使用したいのですが、リンク エラーが発生します。TwoClasstwo.dllclass __declspec(dllexport)one.dll/delayloadtwo.dll

LINK : fatal error LNK1194: cannot delay-load 'two.dll' due to import
of data symbol '"__declspec(dllimport) const TwoClass::`vftable'"
(__imp_??_7TwoClass@@6B@)'; link without /DELAYLOAD:two.dll

これはリリース ビルドです。デバッグビルドでは機能します。(vtable エクスポートに関して、Release と Debug の違いが何であるかはわかりません。また、それを制御するためのコンパイラ スイッチやプラグマも見つかりません。)

/delayloadこのようなクラスをリリース ビルドでエクスポートする DLLを使用するにはどうすればよいですか?

4

4 に答える 4

6

ここを見てください。その人はまったく同じ問題を抱えていて、回避策を見つけたようです

SomeClass クラスを使用していた翻訳単位の最適化を無効にすることで、リリース ビルドで遅延読み込みを機能させることができました - どういうわけか、エクスポートされた vtable への依存関係が取り除かれました。

于 2011-03-08T13:32:09.407 に答える
1

one.dll に TwoClass.hxx が含まれているが実際には使用されていないソース ファイルが含まれているかどうかを確認します。さらに、TwoClass がコンパイラ生成メソッドの条件を満たしているかどうかを確認します (自動生成の条件を参照)。

私の場合、TwoClass のコンパイラ生成のコピー ctor も代入演算子も実際には必要なかったのでprivate:、定義を提供せずにセクションでそれらを宣言しました。これにより one.dll のビルド エラーが発生し、不必要に TwoClass.hxx を含むソース ファイルにたどり着きました。不要なインクルードを削除した後、最適化をオンにして /delayload を使用してコンパイルおよびリンクすることができました。

不必要な#includeステートメントがオプティマイザーを誤って導き、コンパイラが生成した TwoClass のメソッドを .obj ファイルにコピーして、これらの .obj ファイルで使用されていなくても、one.dll にリンクしたと思います。これらの不要なコンパイラによって生成された TwoClass のメソッドは、/delayload とのリンクを妨げているようです。

于 2014-01-18T12:28:26.507 に答える
0

COM と同様に、クラスのインスタンスを渡すファクトリ関数を定義します。これには、クラスのインターフェースがパブリックである必要もありますが、それは誰かがクラスをインポートする場合にも当てはまります。

于 2011-03-08T13:55:53.880 に答える
0

エクスポートされたクラスのインライン実装を含むクラスでもまったく同じ問題がありました。

class __declspec(dllimport) VidExpInternal : public VidExpBase
{
public:
    VidExpInternal(TCHAR* msg=_T(""), int ln=__LINE__, TCHAR* filechar=_T(__FILE__)) :
        VidExpBase (msg,ln,filechar) {}

インライン実装を .cpp ファイルに移動しました。その後、すべてがスムーズに機能しました。

class __declspec(dllimport) VidExpInternal : public VidExpBase
{
public:
    VidExpInternal(TCHAR* msg=_T(""), int ln=__LINE__, TCHAR* filechar=_T(__FILE__));
于 2016-10-25T12:01:30.377 に答える