@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

VC++でテスト用プロジェクトと製品用プロジェクトの設定の仕方

投稿者投稿内容
わたびん
常連さん
会議室デビュー日: 2003/02/26
投稿数: 24
投稿日時: 2004-09-16 11:32
お世話になります。
現在VC++とCppUnitの使い方をお勉強中です。
(当方C系ド素人です。visual studioの使い方もままなりません)

さて
製品を作るためのプロジェクトmain_projectを作りました。
でCppUnitを使ったUT用のプロジェクトtest_projectを作りました。
テストモジュールと製品モジュールを明確に分けたかったからです。

しかしtest_projectでビルドしようとすると
リンク時にmain_projectのものがみえませんっていうエラーになります。

コンパイル時には
「ツール」-「オプション」-「ディレクトリ」-「インクルードファイル」の設定を
適当にいじっていたらヘッダファイルが見つかりませんっていうエラーは回避できました。

以上を踏まえまして、
テスト用のプロジェクトと製品用のプロジェクトをプロジェクト単位で分けたときに
うまく機能させるにはどのようにしたらよいでしょうか?
(そもそも一般的ではないのかな。。。?)
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-16 11:49
既に、一つのプロジェクトで DEBUG 版と RELEASE 版に分かれてるような気が・・・
後、「リンク」のとこで必要なライブラリ指定してないとか。。。
それ以前に、インクルードとライブラリのパスを他のタブメニューで設定したような気が。。。
わたびん
常連さん
会議室デビュー日: 2003/02/26
投稿数: 24
投稿日時: 2004-09-16 13:02
コブラさんこんにちは。

>既に、一つのプロジェクトで DEBUG 版と RELEASE 版に分かれてるような気が・・・
すいません。
このあたりからもうすでについていけません。
ビルドをするとDebug、Releaseのディレクトリが勝手につくられるものも
あったらいかたやDebugだけだったり。。。
たぶん設定の問題だと思うのですが、直感的に今回の問題とは関係ないかなぁ
とおもって気にしていませんでした。

>後、「リンク」のとこで必要なライブラリ指定してないとか。。。
こちらはわかりました。
たぶんまっとうなやり方はプロジェクトの設定でやるのだと思います。
環境全体に対してはツールのオプション
プロジェクト固有のことに対してはプロジェクトの設定でやるものなのだと思います。


>それ以前に、インクルードとライブラリのパスを他のタブメニューで設定したような気が。。。

インクルードのほうはなんとなく解決(?)しているとおもうのですが、
リンクがうまくいきません。
直感ではリンクするときに別プロジェクトにある.objファイルを探してくれればいいと思うのですが。。。
.objってライブラリとはまた別ものですよね?

ライブラリって.libみたいなやつのことだと勝手に思い込んでいるのですが。。。
Lichtenstein
ベテラン
会議室デビュー日: 2003/11/06
投稿数: 61
投稿日時: 2004-09-16 13:16
CppUnitを使用しているなら、メイクファイルを自分で作って、それを使った方が良い場合が多いでしょう。

実行ファイルが出来れば良い訳ですから。デバッガも使わないでしょうし。

まあ、最終的にはご自分の環境にあわせてどうぞ。具体的なプロジェクトの設定について聞きたい場合は、VisualStudio等のバージョンの開示もお願いします。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-16 13:25
ライブラリ、、スタティックリンクとダイナミックリンク・・・
.lib がスタティックで .dll がダイナミックリンクやと記憶しとります。

.obj は各ライブラリとのリンク前の EXE のヘッダ無しのオブジェクトファイル・・・
ライブラリのパスが通ってないっぽい?

インクルードのパス設定の隣ぐらいのタブにライブラリパスの設定タブもあったような気が。
わたびん
常連さん
会議室デビュー日: 2003/02/26
投稿数: 24
投稿日時: 2004-09-16 13:51
Lichtensteinさんこんにちは
<引用>
CppUnitを使用しているなら、メイクファイルを自分で作って、それを使った方が良い場合が多いでしょう。
実行ファイルが出来れば良い訳ですから。デバッガも使わないでしょうし。
まあ、最終的にはご自分の環境にあわせてどうぞ。具体的なプロジェクトの設定について聞きたい場合は、VisualStudio等のバージョンの開示もお願いします。
</引用>

バージョンをみたらVC++6.0って書いてありました。
makeはつかったことがないのでわからないのですが、(個人的には興味津々です)
VC++上から使えるようにしたいとの要望があるのです。
ですので今回はVC++上だけでなんとか解決したいとおもってます。


<引用>
ライブラリ、、スタティックリンクとダイナミックリンク・・・
.lib がスタティックで .dll がダイナミックリンクやと記憶しとります。

.obj は各ライブラリとのリンク前の EXE のヘッダ無しのオブジェクトファイル・・・
ライブラリのパスが通ってないっぽい?

インクルードのパス設定の隣ぐらいのタブにライブラリパスの設定タブもあったような気が。
</引用>

やばいです。ちょっとおなかいっぱいクンです。
ライブラリパスで.objを書いてみたのですが、
やっぱりだめでした(こういうことじゃない??)

ちなみに設定-オブジェクト/ライブラリ モジュールっていうところに.objを追記したところ
------------------------------------
リンク中...
msvcprtd.lib(MSVCP60D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *,class basic_
string<char,struct std::char_traits<char>,class std::allocator<char> >::allocator<char> const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDABV?$allocator@D@1@@Z) はすでに libcpd.lib(ios.obj) で定義されています
msvcprtd.lib(MSVCP60D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_strin
g@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) はすでに libcpd.lib(iostream.obj) で定義されています
msvcprtd.lib(MSVCP60D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(class basic_string<char,s
truct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) はすでに libcpd.lib(ios.
obj) で定義されています
LINK : warning LNK4098: defaultlib "MSVCRTD" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
Debug/test_project.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました
link.exe の実行エラー

test_project.exe - エラー 4、警告 1
------------------------------------
ってなりました。

追加しない場合は

-------------------------------------
リンク中...
MainTest.obj : error LNK2001: 外部シンボル ""public: void __thiscall Main::aaa(void)" (?aaa@Main@@QAEXXZ)" は未解決です
Debug/test_project.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー

test_project.exe - エラー 2、警告 0
------------------------------------
ってなります。

で、かってな妄想なのですが、
main_project全体がlibになってくれれば
test_projectからライブラリとしてパスをきれるようになって
解決するのかなぁって思いました。

p.s.
元々はJavaっ子なんですが、急にC++をやることになりまして、苦労している次第です。。。
わたびん
常連さん
会議室デビュー日: 2003/02/26
投稿数: 24
投稿日時: 2004-09-16 14:09
いま
test_projectの「プロジェクトにファイルを追加」を使って
main_projectのファイルを取り込んだら
うまくリンクまでできました。

なんかイメージと違うのですが、
これでいいのかな???

コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-16 14:13
.obj はリンクするにはするのですが、それは最低限 EXE を創るのに必要な .lib とか
.dll を使って EXE となるファイルのヘッダにマジック番号やら何やら埋め込んでやって
初めて EXE になるので、プロジェクトの .obj は「くっつけられる方」で、くっつける方の
.lib やら .dll があるディレクトリへのパスを、環境で指定してやらんと逝けませんな。

>MainTest.obj : error LNK2001: 外部シンボル ""public: void __thiscall Main::aaa
>(void)" (?aaa@Main@@QAEXXZ)" は未解決です
>Debug/test_project.exe : fatal error LNK1120: 外部参照 1 が未解決です。
>link.exe の実行エラー

>test_project.exe - エラー 2、警告 0

私としましては、こっちの方がまだ救いがあるような気がします。

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