自作クラスをヘッダで他のプロジェクトに簡単にインクルードするには?

解決


アカツメクサ  2003-07-15 14:42:56  No: 51726  IP: [192.*.*.*]

クラスを自作した際、
他のプロジェクトにも有効に使えそうなものは
自作クラス用フォルダを作って、
そのフォルダパスをVC++.netのインクルードディレクトリにして、
#include <@@@@@.h>
としようとしています。が、

一般的にクラスの宣言をヘッダファイルに書き
定義をソースファイルに書くらしいので、そうしたいのですが、

そこで、ヘッダだけをインクルードしてしまうと、
ソース定義がないことになってしまいます。

そのクラスのヘッダに
#include <@@@@@.cpp>

を追加するのも、変なような気がして、
もっと良い方法がないものか悩んでおります・・。

編集 削除
YuO  2003-07-15 15:51:12  No: 51727  IP: [192.*.*.*]

ライブラリにしてしまえばいいのでは?
CRTの不整合には注意する必要がありますが……。

編集 削除
アカツメクサ  2003-07-15 16:26:08  No: 51728  IP: [192.*.*.*]

それは、試しましたが・・。
やりかたが間違っている気がかなりありますが、

ライブラリをつくって
それをライブラリのインクルードディレクトリ(ライブラリ用の新規フォルダ)
にいれて、さっそくヘッダをインクルードして使ってみると、
error LNK2019: 未解決の外部シンボル
となってしまいました。

ライブラリの名前をプロジェクトのプロパティ・リンカに追加する依存関係に設定すると、

warning LNK4098: defaultlib 'LIBC' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
となってしまいました。

それは、リリースでライブラリを作ったため、リリース用になっている?とゆうことらしく、リリースにするとそのワーニングはなくなりましたが・・・

しかし、それでは、プロパティでいろいろなライブラリの名前を入力設定しなければならずたいへんで、また、ソースを直しながら(CRTの不整合 = ソース間違いの意味??)とゆうことにもいかないため、 難しい気がしましたが・・

編集 削除
YuO  2003-07-15 19:54:54  No: 51729  IP: [192.*.*.*]

> warning LNK4098: defaultlib 'LIBC' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
> となってしまいました。
> それは、リリースでライブラリを作ったため、リリース用になっている?とゆうことらしく、リリースにするとそのワーニングはなくなりましたが・・・

そのとおりです。

> しかし、それでは、プロパティでいろいろなライブラリの名前を入力設定しなければならずたいへんで、また、ソースを直しながら(CRTの不整合 = ソース間違いの意味??)とゆうことにもいかないため、 難しい気がしましたが・・

えーっと,まず,
・Single Thread
・Single Thread (Debug)
・Multi Thread
・Multi Thread (Debug)
・Multi Thread (DLL)
・Multi Thread (Debug, DLL)
の各CRT用のライブラリを作成します。
#仮にファイル名をそれぞれfoos.lib, foosd.lib, foom.lib, foomd.lib, food.lib, foodd.libとします。

そして,ヘッダファイルにそいつを読み込むようなプラグマを埋め込みます。
#if defined(_DLL)
#if defined(_DEBUG)
#pragma comment(lib, "foodd.lib")
#else
#pragma comment(lib, "food.lib")
#endif /* _DEBUG */
#elif defined(_MT)
#if defined(_DEBUG)
#pragma comment(lib, "foomd.lib")
#else
#pragma comment(lib, "foom.lib")
#endif /* _DEBUG */
#else
#if defined(_DEBUG)
#pragma comment(lib, "foosd.lib")
#else
#pragma comment(lib, "foos.lib")
#endif /* _DEBUG */
#endif /* _DLL, _MT */
↑ライブラリを$(LIB)外に置いているのであれば,フルパスにしてください。
これで,あとはこのヘッダファイルをインクルードするだけで利用可能です。

ちなみに,このプラグマはVC++専用です。
コンパイラによって異なることは覚えておいてください。

編集 削除
アカツメクサ  2003-07-15 22:06:58  No: 51730  IP: [192.*.*.*]

ちょっと、たいへんで
紆余曲折ありましたが
できました!

設定は
プロジェクトのプロパティの
C/C++のコード生成のランタイムライブラリの欄に
それら、6つの設定をする部分がありました。

デバッグではできたと思ったのですが
リリースにしたら
warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
といったものがでてしまっています

が、とりあえず、思ったことは、解決いたしました。

あとはなんとか楽しみながら調べていけそうです。
(だめかもしれませんが・・・)

感謝します。
ありがとうございました!

編集 削除