- PR -

lib環境で作成したtemplateクラス内のpublicメソッドを、DLL環境内からコールするソリューションのリンクエ

1
投稿者投稿内容
たけやん
会議室デビュー日: 2004/11/10
投稿数: 9
投稿日時: 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 ]
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2004-11-11 00:45
こんばんは、meiです。

引用:

たけやんさんの書き込み (2004-11-10 14:30) より:
=== 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;}
};


例で挙がっていたソースを打ち込んでlibとdllとdllを呼び出すexeを作ったところうまく動きました。動かなかった実際のソースと例とで何か違いはありませんでしょうか?

たとえば、lib_test.h内にあるメンバ関数を.cppへ移動させると問題のエラーが発生します。一応ご確認しますが、LibClassのメンバ関数はすべてヘッダで実装しているんですよね?
たけやん
会議室デビュー日: 2004/11/10
投稿数: 9
投稿日時: 2004-11-11 12:04
meiさん、ご返答ありがとうございます。

>たとえば、lib_test.h内にあるメンバ関数を.cppへ移動させると問題のエラーが発生します。一応ご確認しますが、LibClassのメンバ関数はすべてヘッダで実装しているんですよね?

すみません、meiさんの仰るとおり、LibClassのメンバ関数をコンストラクタ以外は、別のcppファイル内に実装していました。
考えてみれば、STLもヘッダレベル(実際には.hはありませんが)での実装になっていますね。
これで悩みは解決しました。
meiさん、本当に有難うございました!
また、何かありましたら宜しくご教授をお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)