2

Catch2 を使用して学習プロジェクトをセットアップしようとしていますが、更新を取得して他の C++ プロジェクトに使用できるように、リポジトリを Cpp フォルダーに複製するのが最善であると判断しました。取り付け方法はこちらのとおりです。

基本的なフォルダ構造は次のとおりです。

Cpp
├───TestProject
│   ├───main.cpp
│   ├───.vscode
│   └───build
│       ├───CMakeFiles
│       └───Testing
└───Catch2
   ├─── ...
  ...

Catch2 のドキュメントに従って、これを CMake ファイルに置きます。

find_package(Catch2 REQUIRED)
target_link_libraries(tests Catch2::Catch2)

ただし、VS Code でプロジェクトを構成しようとすると、次のエラー メッセージが表示されます。

[cmake] CMake Error at CMakeLists.txt:5 (target_link_libraries):
[cmake]   Cannot specify link libraries for target "tests" which is not built by this
[cmake]   project.

main.cppは単なる Hello World ファイルであり、完全な CMakeLists.txt ファイルの内容は次のとおりです。

cmake_minimum_required(VERSION 3.0.0)
project(TestProject VERSION 0.1.0)

find_package(Catch2 REQUIRED)
target_link_libraries(tests Catch2::Catch2)
enable_testing()

add_library(TestProject TestProject.cpp)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

なぜこれが起こるのかわかりません。私は仕事で使用しなければならなかった非常に基本的なコマンドを除いて、CMake の完全な初心者です。意図したようにヘッダーファイルとしてドロップする方が簡単だと思いますが、このアプローチは私にとってより理にかなっています...

注: 私はこの SO の質問を読みました。しかし、彼の質問は、プロジェクト内のヘッダー ファイルとしての Catch2 に関するものでした。

注 2: 望ましい動作は、Catch2 を外部ライブラリとして使用してプロジェクトをビルドすることです。

(追加情報: CMake --version は 3.13.3、VS Code で CMakeTools を使用、OS は Windows 10)

4

1 に答える 1

0

まず、ライブラリは CMake を介してインストールされているため (パッケージ マネージャーを使用したインストールにも同じことが適用されます)、フラグを立てることをお勧めしfind_packageますCONFIG(構成モードについてはこちらを参照してください)。これは、Catch2 リポジトリがプロジェクトの親の共通フォルダーにある場合でも、CMake インストール プロセスによって Program Files フォルダー (Windows の場合) にインストールされるためです。つまり、リポジトリはまさにそれです。

さらにadd_executable(tests main.cpp)、CMake がターゲットとして「テスト」を持つようにする必要があります。これにより、元の問題が解決されます。

ただし、完全に機能させるには、次の追加手順に従う必要があります。

  1. 使用するcatch_discover_tests(tests)
  2. include(CTest)必要な可能性があります。
  3. インクルード プリプロセッサ コマンドは#include <catch2/catch.hpp>、単に ではなく、次のようにする必要があります#include "catch.hpp"

また、エディタが Catch2 のインストール中に作成された環境変数を認識していることを確認してください。つまり、問題が発生した場合は、エディターを再起動して、環境変数を再読み込みします。

完全な CMakeLists.txt:

cmake_minimum_required(VERSION 3.5.0)
project(TestProject LANGUAGES CXX VERSION 0.1.0)

find_package(Catch2 REQUIRED)
add_executable(tests main.cpp) # solution to the original problem
target_link_libraries(tests Catch2::Catch2)

include(CTest) # not sure if this is 100% necessary
include(Catch)
catch_discover_tests(tests)
enable_testing()

注: の代わりにadd_executableを使用する必要add_libraryがありますが、何らかの理由でライブラリ モードではテストが認識されません。ただし、それはCatch2の使用に関する知識にあるため、この質問の範囲を超えています。

于 2019-01-20T19:00:08.280 に答える