私には2つのモジュールがあり、それぞれに独自のクラスと独自のオブジェクトがあります。各モジュールはDLLにコンパイルされます。別のクラスのオブジェクトへのポインタを持つ「クロスDLL」メソッド呼び出しを行いたいのですが、リンカはこれを許可していません(MSVC ++2008)。
すなわち:
- calledClassを持つcalledModule.cppと、このクラスのオブジェクト(calledObject)があります。クラスは、私が呼び出したいメソッドを呼び出しました。モジュールはDLLにコンパイルされ、Lib.dllと呼ばれるようになります(驚きです!)。
- callingClassを持つcallingModule.cppがあります。特に、クラスには、calledObjectへのポインタである属性があります。モジュールはDLLcallingLib.dllにコンパイルされます。calledObjectのポインターはコンストラクターで設定されます。
コード全体をコンパイルすることができます。リンカが起動すると問題が発生します。次のメッセージが表示されます:moduleCalling.obj:エラーLNK2001:未解決の外部シンボル "public:void __thiscall classCalled :: methodCalled..."
私はdeclspecのものを使用しないので、calledLib.dllから何もエクスポートされません。
私が呼び出しているメソッド(methodCalled)は実装に存在し、そのプロトタイプはヘッダーで正しく宣言されています。classCalledは「基本的な」クラスであり、何からも継承されません。さらに、methodCalledを仮想として宣言すると、プロジェクト全体がコンパイルされ、正しく機能します...
別のDLLから「通常の」方法でオブジェクトのメソッドを呼び出せないのはなぜですか?なぜそれを「仮想」として宣言することが役立つのでしょうか。誰もが知っていますか?私にはいくつかの推測がありますが、専門家の回答はこのことを理解するのに大いに役立ちます。
PS:私はMSVC++2008を使用しています。
ありがとう!
更新:コードがどのように見えるかを反映するコードスニペットを追加します。
// part of calledLib.dll
// moduleCalled.h
class classCalled {
public:
int methodCalled() { return 1 };
};
// ---------------------------------------------------------------
// part of callingLib.dll
// moduleCalling.h
#include "moduleCalled.h"
class classCalling {
public:
classCalled* ref;
void justSomeMethod();
};
// ---------------------
// moduleCalling.cpp
#include "moduleCalling.h"
void classCalling::justSomeMethod() {
ref = new classCalled();
int a = ref->methodCalled(); // <--- this is not allowed by linker,
// unless methodCalled is made virtual.
}