- - PR -
lib環境で作成したtemplateクラス内のpublicメソッドを、DLL環境内からコールするソリューションのリンクエ
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-11-10 14:30
初めまして、宜しくお願い致します。
@C++.NETのソリューションファイル内に、lib(static link library)構成とDLL(dynamic link library)構成のプロジェクトがそれぞれ1つずつあります。 「test.sln」ファイル内に、「lib.vcprj」と「dll.vcprj」プロジェクトを追加します。 Alib構成プロジェクト内には汎用クラス(template)を使ったクラスが在り、この中には幾つかのpublicメソッドが定義してあります。 === lib.vcprj内のtemplateクラス[lib_test.h] === template <class Typ> class LibClass { Typ data; public: LibClass():Data(0) {}; // Constructor Typ libfunc(void) {return data;} void libfunc2(Typ dt) {data = dt;} }; BDLL構成プロジェクト内のdllfunc()関数内から、lib構成プロジェクト内の汎用クラスのインスタンスを生成後、汎用クラス内のpublicメソッドをコールしています。 === dll.vcprj内のソースコード[dll_test.cpp] === #include <lib_test.h> void dllfunc(void) { LibClass<int> *lib = new LibClass<int>; lib->libfunc2(123); int ret = lib->libfunc(); } このソリューションをビルドすると、 ---------------------------------- error LNK2019: 未解決の外部シンボル "public: int __thiscall namespc::LibClass<int>::libfunc(void)" (?libfunc@?$TempClass@_K@namespc@@QAEHXZ) が関数 "public: virtual class namespc::void __thiscall namespc::DllClass::Dllfunc(void)" (?dllfunc@DllClass@namespc@@UAE) で参照されました。 ※「libfunc2」についても同様のリンクエラーが出ます。 ---------------------------------- というリンクエラーが出てしまいます。 lib構成プロジェクト内の汎用クラスの型が静的に決まらないので、ビルド時に上記のようなエラーが出るのでしょうか? どなたか回避手段をご教授下さい。宜しくお願い致します。 [ メッセージ編集済み 編集者: たけやん 編集日時 2004-11-10 14:31 ] | ||||
|
投稿日時: 2004-11-11 00:45
こんばんは、meiです。
例で挙がっていたソースを打ち込んでlibとdllとdllを呼び出すexeを作ったところうまく動きました。動かなかった実際のソースと例とで何か違いはありませんでしょうか? たとえば、lib_test.h内にあるメンバ関数を.cppへ移動させると問題のエラーが発生します。一応ご確認しますが、LibClassのメンバ関数はすべてヘッダで実装しているんですよね? | ||||
|
投稿日時: 2004-11-11 12:04
meiさん、ご返答ありがとうございます。
>たとえば、lib_test.h内にあるメンバ関数を.cppへ移動させると問題のエラーが発生します。一応ご確認しますが、LibClassのメンバ関数はすべてヘッダで実装しているんですよね? すみません、meiさんの仰るとおり、LibClassのメンバ関数をコンストラクタ以外は、別のcppファイル内に実装していました。 考えてみれば、STLもヘッダレベル(実際には.hはありませんが)での実装になっていますね。 これで悩みは解決しました。 meiさん、本当に有難うございました! また、何かありましたら宜しくご教授をお願い致します。 |
1