Я видел много примеров с той же проблемой, но они не относились к моей ситуации.
У меня есть следующая файловая структура:
unit-tests/CMakeLists.txt
unit-tests/FlaAlgoTests/CMakeLists.txt
unit-tests/FlaAlgoTests/catch_test_runner.cpp
В Proj/CMakeLists.txt
:
ExternalProject_Add(
catch
PREFIX ${CMAKE_BINARY_DIR}/catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
TIMEOUT 10
UPDATE_COMMAND ${GIT_EXECUTABLE} pull
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(catch source_dir)
include_directories(${source_dir}/single_include/catch2)
И в Proj/TestDir1/CMakeLists.txt
:
add_executable(
catch_test_runner
catch_test_runner.cpp
)
Где catch_test_runner.cpp
:
#include <iostream>
#include "catch.hpp"
#define CATCH_CONFIG_MAIN
TEST_CASE("Yeet", "[beep]"){
REQUIRE(true);
REQUIRE(2 == 1);
}
Все это выглядит прекрасно и, кажется, в основном является копией/вставкой многочисленных руководств, которые я нашел для этого. Однако я получаю следующую проблему:
[100%] Linking CXX executable catch_test_runner.exe
CMakeFiles/catch_test_runner.dir/catch_test_runner.o: In function `::____C_A_T_C_H____T_E_S_T__(void)':
/cygdrive/c/Users/dbak/Projects/firmware/unit-tests/FlaAlgoTests/catch_test_runner.cpp:7: undefined reference to `Catch::StringRef::StringRef(char const*)'
/cygdrive/c/Users/dbak/Projects/firmware/unit-tests/FlaAlgoTests/catch_test_runner.cpp:7:(.text+0x32): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Catch::StringRef::StringRef(char const*)'
/cygdrive/c/Users/dbak/Projects/firmware/unit-tests/FlaAlgoTests/catch_test_runner.cpp:7: undefined reference to `Catch::AssertionHandler::AssertionHandler(Catch::StringRef const&, Catch::SourceLineInfo const&, Catch::StringRef, Catch::ResultDisposition::Flags)'
Таким образом, очевидно, что он может ссылаться на catch.hpp, иначе он не смог бы найти ничего из этого. И, очевидно, я использую версию catch single_include, которая является проблемой во всех найденных мною примерах той же проблемы.
Что я делаю неправильно?
Строка #define CATCH_CONFIG_MAIN
сообщает заголовку catch.hpp
, что он также должен генерировать реализацию Catch. Но для этого эта строка должна быть до включая catch.hpp
:
#define CATCH_CONFIG_MAIN // This should come **before** including the 'catch.hpp'.
#include "catch.hpp"
И обязательно включите правильный файл catch.hpp. В самой последней версии Catch2 есть 2 файла с таким именем. И вам, вероятно, понадобится тот, который находится в каталоге Catch2-master/single_include/catch2.