7

私が理解している限りでは、単純catch.hppにプロジェクト ディレクトリに配置し、それをプロジェクトに追加してから、テストの作成を開始できます。チュートリアルで概説されているマクロのいくつかを使用しようとすると、いくつか、正確には 11 個のリンカー エラーが発生します。

#include "catch.hpp"

unsigned int Factorial( unsigned int number ) {
    return number <= 1 ? number : Factorial(number-1)*number;
}

TEST_CASE( "Factorials are computed", "[factorial]" ) {
    REQUIRE( Factorial(1) == 1 );
    REQUIRE( Factorial(2) == 2 );
    REQUIRE( Factorial(3) == 6 );
    REQUIRE( Factorial(10) == 3628800 );
}

最初の例から単一のファイルを作成して g++ でコンパイルすることはできますが、同じコードを VS2010 プロジェクトに貼り付けて実行しようとすると、リンカー エラーが発生します。残念ながら、私はこの時点でエラーを自分でデコードするのに十分な C++ に精通していません。また、ここで単一のファイルを見た後、問題を識別することができませんでした。

Error   1   error LNK2019: unresolved external symbol "public: __thiscall Catch::AutoReg::AutoReg(void (__cdecl*)(void),struct Catch::SourceLineInfo const &,struct Catch::NameAndDesc const &)" (??0AutoReg@Catch@@QAE@P6AXXZABUSourceLineInfo@1@ABUNameAndDesc@1@@Z) referenced in function "void __cdecl `anonymous namespace'::`dynamic initializer for 'autoRegistrar27''(void)" (??__EautoRegistrar27@?A0x3911e331@@YAXXZ)    C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   2   error LNK2019: unresolved external symbol "public: __thiscall Catch::ExpressionResultBuilder::ExpressionResultBuilder(enum Catch::ResultWas::OfType)" (??0ExpressionResultBuilder@Catch@@QAE@W4OfType@ResultWas@1@@Z) referenced in function __catch$?____C_A_T_C_H____T_E_S_T____27@@YAXXZ$0   C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   3   error LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl Catch::translateActiveException(void)" (?translateActiveException@Catch@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) referenced in function __catch$?____C_A_T_C_H____T_E_S_T____27@@YAXXZ$0   C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   4   error LNK2019: unresolved external symbol "public: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionResultBuilder::endExpression(enum Catch::ResultDisposition::Flags)" (?endExpression@ExpressionResultBuilder@Catch@@QAEAAV12@W4Flags@ResultDisposition@2@@Z) referenced in function "void __cdecl ____C_A_T_C_H____T_E_S_T____27(void)" (?____C_A_T_C_H____T_E_S_T____27@@YAXXZ)   C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   5   error LNK2019: unresolved external symbol "public: __thiscall Catch::AssertionInfo::AssertionInfo(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct Catch::SourceLineInfo const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,enum Catch::ResultDisposition::Flags)" (??0AssertionInfo@Catch@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABUSourceLineInfo@1@0W4Flags@ResultDisposition@1@@Z) referenced in function "void __cdecl ____C_A_T_C_H____T_E_S_T____27(void)" (?____C_A_T_C_H____T_E_S_T____27@@YAXXZ) C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   6   error LNK2019: unresolved external symbol "struct Catch::IContext & __cdecl Catch::getCurrentContext(void)" (?getCurrentContext@Catch@@YAAAUIContext@1@XZ) referenced in function "struct Catch::IResultCapture & __cdecl Catch::getResultCapture(void)" (?getResultCapture@Catch@@YAAAUIResultCapture@1@XZ)    C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   7   error LNK2019: unresolved external symbol "public: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionResultBuilder::setOp(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?setOp@ExpressionResultBuilder@Catch@@QAEAAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "private: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionLhs<int const &>::captureExpression<0,int>(int const &)" (??$captureExpression@$0A@H@?$ExpressionLhs@ABH@Catch@@AAEAAVExpressionResultBuilder@1@ABH@Z) C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   8   error LNK2019: unresolved external symbol "public: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionResultBuilder::setRhs(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?setRhs@ExpressionResultBuilder@Catch@@QAEAAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "private: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionLhs<int const &>::captureExpression<0,int>(int const &)" (??$captureExpression@$0A@H@?$ExpressionLhs@ABH@Catch@@AAEAAVExpressionResultBuilder@1@ABH@Z)   C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   9   error LNK2019: unresolved external symbol "public: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionResultBuilder::setLhs(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?setLhs@ExpressionResultBuilder@Catch@@QAEAAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "private: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionLhs<int const &>::captureExpression<0,int>(int const &)" (??$captureExpression@$0A@H@?$ExpressionLhs@ABH@Catch@@AAEAAVExpressionResultBuilder@1@ABH@Z)   C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   10  error LNK2019: unresolved external symbol "public: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionResultBuilder::setResultType(bool)" (?setResultType@ExpressionResultBuilder@Catch@@QAEAAV12@_N@Z) referenced in function "private: class Catch::ExpressionResultBuilder & __thiscall Catch::ExpressionLhs<int const &>::captureExpression<0,int>(int const &)" (??$captureExpression@$0A@H@?$ExpressionLhs@ABH@Catch@@AAEAAVExpressionResultBuilder@1@ABH@Z)  C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   11  error LNK2019: unresolved external symbol "public: __thiscall Catch::AutoReg::~AutoReg(void)" (??1AutoReg@Catch@@QAE@XZ) referenced in function "void __cdecl `anonymous namespace'::`dynamic atexit destructor for 'autoRegistrar27''(void)" (??__FautoRegistrar27@?A0x3911e331@@YAXXZ)    C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\FirstCPPApplication\FirstCPPApplication.obj 1   1   FirstCPPApplication
Error   12  error LNK1120: 11 unresolved externals  C:\Users\Mark\documents\visual studio 2010\Projects\FirstCPPApplication\Debug\FirstCPPApplication.exe   FirstCPPApplication
4

2 に答える 2

7

簡単に言うと、単一のプロジェクト ソリューションを 3 つに分割し.lib、古いものを使用しexe、プロジェクトを適切なパスに追加し、リンカーを更新すれば、準備完了です。

AE ドリューの回答は私の問題を解決するのに役立ちましたが、特に初心者の観点から簡単な内訳を探している場合は、誰かが Google から来た場合に備えて、質問のタイトルにもっと完全な解決策を付けたいと思います。

ソリューションにビルドされたプロジェクトが 1 つしかない.exe場合、CATCH は機能しません。コードをテストできるようにするには、ソリューションに 3 つのプロジェクトが必要です (私が知る限り)。

  • Source_project、メインのコードベース プロジェクト (アプリケーションのソース コードが存在するプロジェクト)

  • Test_project、テスト スイート プロジェクト (REQUIRES上記の質問で概説したようにテストが表示されます)

  • Main_project、ソース コードベースから実際にコードを呼び出して実行するプロジェクト。

元の単一プロジェクト ソリューションを両方のテストで使用できるものに変換し、適切に実行するには、.libまたはをビルドし.dllて、他のプロジェクト (他の人のプロジェクトを含む) が同じコードを使用できるようにする必要があります。この回答を変更すると、必要なのは

ソリューション エクスプローラーでプロジェクトを右クリックし、[プロパティ...] を選択します。[構成プロパティ] -> [全般] の下に、[構成の種類] という > オプションがあります。[Static Library > (.lib)] に変更すると、プロジェクトの.libビルド時に [ ] が生成されます。

そして 3 番目のプロジェクトではmain_project、次のようなファイルのみを含む Win32 コンソール アプリケーションからのベアボーン セットアップがあります。

#include "stdafx.h"
#include "HEADER_FROM_FIRST_PROJECT.h"

int _tmain(int argc, _TCHAR* argv[])
{
   METHOD_FROM_FIRST_PROJECT();
   return 0;
}

Source_projectここで、最初に作成したプロジェクト (以前exeは でしたが、現在は にビルドされているプロジェクト)からヘッダー ファイルをインポートしますlib。しかし、それはまだ実行されません。Source_projectソリューション エクスプローラーでプロジェクトを右クリックし、[プロパティ] > [構成プロパティ] > [C/C++] > [全般] > [追加のインクルード ディレクトリ] の下で、このプロジェクトの追加のディレクトリに のディレクトリを追加する必要があります。source_projectのフォルダをリストに追加します。これにより、#include行がそのディレクトリで適切なファイルを自動的に検索できるようになり、 ../source_project/HEADER_FROM_FIRST_PROJECT.h.

最後に、最後のステップは、リンカーが実際にインクルードしようとしているオブジェクトを見つけられるようにすることです。を構築しているので .lib、これをかなり簡単に行うことができます。以前と同じ設定ダイアログ ボックスである [プロジェクト プロパティ] ダイアログで、代わりに [構成プロパティ] > [リンカー] > [入力] > [追加の依存関係] に移動し、 source_project.libファイルへの相対パスを追加します../Debug/source_project.lib

.dll古いexeプロジェクトに がある場合は、新しい に移動する必要があることに注意してくださいmain_project

また、これはすべて私にとって非常に新しいことであり、用語や情報の一部が間違っていることに注意してください.

于 2013-10-06T05:22:34.960 に答える
6

提供されたリンクをスキャンするだけで、ファイルの先頭にこの行を追加する必要があると思います.

#define CATCH_CONFIG_MAIN  // This tells Catch to provide a main() - only do this in one cpp file

リンクしようとしている関数は、#if defined CATCH_CONFIG_MAIN .... #endifプリプロセッサ ディレクティブ内にあるようです。

于 2013-08-02T05:29:22.040 に答える