Ошибка связывания библиотеки тестового модуля Catch

Я пытаюсь использовать пакетный набор тестов CATCH, указанный ниже.
https://github.com/philsquared/Catch

Однако я не могу сделать это правильно.
Main.cpp и test.cpp заключаются в следующем.

//main.cpp
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
//test.cpp
#include "catch.hpp"
TEST_CASE("TESTTest", "") {
CHECK(1 != 2 );
}

Когда эти два файла находятся в одной папке, я могу получить желаемый результат.
Однако я перенес test.cpp в подкаталог с именем test, Он больше не работает, как ожидалось, но генерирует ошибки связывания.

Моя настройка cmake описана ниже.

project(catchTest)
cmake_minimum_required(VERSION 2.8)

file(GLOB_RECURSE INCS "./*.cpp")
add_executable(${PROJECT_NAME} main.cpp ${INCS})

include_directories(.)

file(GLOB_RECURSE INCS "./*.cpp") был добавлен, чтобы включить все исходные файлы cpp, расположенные в подкаталогах. а также include_directories(.) был включен, чтобы дать им знать определение catch.hpp,

Я уверен, что сделал что-то не так, но не знаю, как это исправить.
Пожалуйста, посоветуйте мне решить эту проблему.

Он был запущен в Windows, скомпилирован с использованием mingw gcc-4.9.1 и сгенерирован генератором cmake ninja.

РЕДАКТИРОВАТЬ: я добавил первые несколько строк сообщений об ошибках.

СБОЙ: cmd.exe / cd. && C: \ MinGW \ bin \ g ++. Exe CMakeFiles / catchTest.dir / main.cpp.obj CMakeFiles / catchTest.dir / main.cpp.obj CMakeFiles / catchTest.dir / test / testTest.cpp.obj -o catchTest.exe -Wl, — out-implib, libcatchTest.dll.a -Wl, — major-image-version, 0, — minor-image-version, 0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && CD .
CMakeFiles / catchTest.dir / main.cpp.obj: main.cpp :(. Text + 0x0): множественное определение `Catch :: getResultCapture () ‘

CMakeFiles / catchTest.dir / main.cpp.obj: main.cpp :(. Text + 0x0): сначала определено здесь

1

Решение

Ваш CMakeLists.txt неправильный, он включает основной дважды. Если вы измените оператор add_executable, как это, он работает для меня:

add_executable(${PROJECT_NAME} main.cpp test.cpp )

Надеюсь, это поможет.

Ким

3

Другие решения

Вы должны включить правильный catch.hpp. В репозитории есть два разных включения с одинаковыми именами: одно включает и одно называется single_include. Пожалуйста, убедитесь, что вы используете single_include.

3

Когда вы видите что-то вроде ошибки связывания из библиотеки заголовочных файлов, такой как catch, это означает, что вы неправильно установили путь включения.

использование single_include не include,

0
По вопросам рекламы [email protected]