3

私はこれまでVisualStudioをあまり使用していませんでした。私は暇なときに個人的なプロジェクトを開始しました。Java開発で大きなメリットがあったので、テスト駆動開発を使用したいと思います。私はかなり前にこのプロジェクトを開始し、CppUnitを使用しました。おそらく他のより良いフレームワークがあることは知っていますが、これはすでに実施されているものです。

私のVisualStuido2005ソリューションには、2つのプロジェクトが含まれています。単体テストがアプリケーションコードのすぐ横にある場合は、正常に機能しました。プロジェクトの規模が大きくなるにつれて、これは非常に面倒でエレガントではなくなりました。私は自分のソリューションの下で単体テストを収容するための新しいプロジェクトを作成しました(したがって、現在3つのプロジェクトがあります)。ソリューションを構築しようとするまで、すべてがうまくいきました。すべてがコンパイルされましたが、単体テストプロジェクトはリンクできませんでした。出力には、テストで呼び出されるすべての関数のように見えるものに対して、51個の「未解決の外部シンボル」エラー(LNK2019)が表示されます。

私が推測できる限り、問題はVisualStudioが作成するディレクトリ構造です。各プロジェクトは独自のディレクトリを取得し、その下に作成されるオブジェクトファイルと実行可能ファイルがあります。問題は、ヘッダーファイルが各単体テストに適切にインクルードされているのに、リンカがcppファイルを見つけることができないことです。これは、それらが異なるディレクトリにあるためです。呼び出された関数の実装が見つからない場合、2019エラーが発生します。

私は問題の評価に正しいですか?どうすれば修正できますか?プロジェクトを完全に再編成する必要がありますか、それともリンカーの単純な構成ですか?

ありがとう

4

3 に答える 3

1

はい、あなたの評価はかなり良いですね。これを試してください:ソリューションエクスプローラーで、テストを含むプロジェクトの名前を右クリックし、[プロジェクトの依存関係]を選択します。依存しているすべてのプロジェクトにチェックを入れます。これでリンカー設定がセットアップされ、正しいファイルが自動的に検出されるようになります。

于 2008-11-18T02:56:59.323 に答える
1

テスト プロジェクトがメイン プロジェクトから使用している関数/クラスがエクスポートされていないようです。コードがエクスポートされていない場合、コードが存在する DLL/exe の外部では何も参照できません。

これを処理する一般的な方法は、プロジェクトに定義を追加することです (プロジェクト設定で、[構成プロパティ] -> [C/C++] -> [プリプロセッサ] に移動します。最初の行に定義があります) のようなものを呼び出しますPROJECTNAME_IMPL(必ずこれを実行してください)。デバッグ構成とリリース構成の両方に!)。次に、エクスポートされたものに含まれるヘッダー ファイル (ProjectNameExport.h と呼ばれる) があり、次のような内容が含まれます。

#ifdef PROJECTNAME_IMPL
    #define PROJECTNAME_API __declspec(dllexport)
#else
    #define PROJECTNAME_API __declspec(dllimport)
#endif

次に、クラスを定義するとき (たとえば):

#include "ProjectNameExport.h"

class PROJECTNAME_API Foo
{
};

これにより、ヘッダー ファイルがプロジェクト内のファイルに含まれている場合はクラスがエクスポートされ、ヘッダー ファイルが別のプロジェクト (もちろん最初のプロジェクトにリンクしている) のファイルに含まれている場合はクラスがインポートされます。

于 2008-11-25T20:17:38.877 に答える
1

私は常に、テストするコードを別の静的 .lib ファイルに追加し、メイン アプリケーション EXE と単体テスト EXE をこれに依存させます。新しいコードが .lib プロジェクトに追加され、依存関係のサポートにより、EXE がエラーなしでリンクされることが保証されます。EXE プロジェクトが .lib ヘッダーを見つけられるようにする必要がありますが、これはディレクトリ構造によって異なります。また、.lib と EXE が同じ CRT/MFC ライブラリを使用していることにも注意する必要があります (たとえば、CRT を使用する場合、静的にリンクしたり、DLL を使用したりできます)。

複数のプロジェクトにファイル/ヘッダーを追加するよりも、この方法でライブラリを使用する方が維持しやすいと思います。

Boost テスト フレームワークを使用していますが、TDD フレームワークに関係なく、これを同じように構成します。

同様の設定に関する優れた記事は、次の場所にあります。

http://www.codeproject.com/KB/architecture/Designing_Robust_Objects.aspx

于 2008-11-25T20:29:20.867 に答える