本家「TestRunner」のプロジェクトを見ると、「Components/MfcTestRunner.h」がどうもその部分らしい。
このクラスと同じI/Fを持ったクラス「TestRunnerEECore」を作ってみた(関数部分をすべて空にした)。
そして、ビルドを実行。
すると、リンクエラーが発生。
warning LNK4248 が1件
error LNK2028: が7件
error LNK2019: が7件
ワーニングは後回しにして、まずは「LNK2028」の意味を確認した。
http://msdn.microsoft.com/ja-jp/library/ms235590(VS.80).aspx
「ただし、/clr:pure の呼び出し規約は __clrcall です。次のサンプルは LNK2028 を生成します。」
との記述があったため、コンパイルオプションを変更してみた。
(1)構成のプロパティを変更
[プロジェクト] → [プロパティ] → [構成プロパティ] → [全般] → [共通言語ランタイム サポート]
■変更前 : 純粋 MSIL 共通言語ランタイム サポート (/clr:pure)
■変更後 : 共通言語ランタイム サポート (/clr)
(2)C/C++のプロパティを変更
[プロジェクト] → [プロパティ] → [C/C++] → [全般] → [共通言語ランタイム サポート]
■変更前 : 純粋 MSIL 共通言語ランタイム サポート (/clr:pure)
■変更後 : 共通言語ランタイム サポート (/clr)
上記2箇所の設定変更ですべてのエラーは解消。
早速実行した所、無事起動できた。
続いて、サンプルプログラムを作成。
(1) Counter.h
//=========================================================================== #pragma once
//=========================================================================== class Counter { //--------------------------------------------------------------------------- private: // プライベート変数 int Count; // カウント値(=int型の変数)を内包する
//--------------------------------------------------------------------------- public: // コンストラクタ Counter(); // カウント値の初期値は「0」である
// メソッド int Get() const; // 現在のカウント値を返す void Incr(); // カウント値を+1する void Clear(); // カウント値を初期値(=0)に設定する };
(2) Counter.cpp
//===========================================================================#include "Counter.h"
//===========================================================================Counter::Counter() { Clear( );}
//===========================================================================int Counter::Get() const { return Count;}
//===========================================================================void Counter::Incr(){ Count++;}
//===========================================================================void Counter::Clear(){ Count = 0;}
(3) CounterTest.h
//===========================================================================// MoneyTest.h//===========================================================================#pragma once
#include
//===========================================================================class CounterTest : public CPPUNIT_NS::TestFixture{ Counter CounterObj;
CPPUNIT_TEST_SUITE( CounterTest ); CPPUNIT_TEST( testGet ); CPPUNIT_TEST( testIncr ); CPPUNIT_TEST( testClear ); CPPUNIT_TEST_SUITE_END();
public: void setUp(); void tearDown();
void testGet( ); void testIncr( ); void testClear( );};
(4) CounterTest.cpp
//===========================================================================// CounterTest.cpp//===========================================================================
#include#include "Counter.h"#include "CounterTest.h"
// Registers the fixture into the 'registry'CPPUNIT_TEST_SUITE_REGISTRATION( CounterTest );
//===========================================================================void CounterTest::setUp(){ CounterObj.Clear( );}
//===========================================================================void CounterTest::tearDown(){}
//===========================================================================void CounterTest::testGet( ){ CPPUNIT_ASSERT_EQUAL( CounterObj.Get( ), (int)0 );}
//===========================================================================void CounterTest::testIncr( ){ CounterObj.Incr( ); CPPUNIT_ASSERT_EQUAL( CounterObj.Get( ), (int)1 );}
//===========================================================================void CounterTest::testClear( ){ CounterObj.Incr( ); CounterObj.Clear( ); CPPUNIT_ASSERT_EQUAL( CounterObj.Get( ), (int)0 );}
これらをプロジェクトに追加してビルド。
無事ビルドに成功し、TestRunnerEEが起動された。
GUIとTestRunner部の連結は次回に持ち越し。
0 件のコメント:
コメントを投稿