У меня есть следующая структура проекта:
test_main.cc
#define CATCH_CONFIG_MAIN
#include "catch2.hpp"
test1.cc
#include "catch2.hpp"
#include "test_utils.hpp"
TEST_CASE("test1", "[test1]") {
REQUIRE(1 == 1);
}
test2.cc
#include "catch2.hpp"
#include "test_utils.hpp"
TEST_CASE("test2", "[test2]") {
REQUIRE(2 == 2);
}
test_utils.hpp
#pragma once
#include <iostream>
void something_great() {
std::cout << ":)\n";
}
Если я компилирую, используя что-то вроде clang++ -std=c++17 test_main.cc test1.cc test2.cc
, функция something_great
определена как в test1.o, так и в test2.o. Это приводит к ошибке вроде
duplicate symbol __Z15something_greatv in:
test1.cc.o
test2.cc.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
В разделе Увеличение масштаба документации Catch2. , они упоминают, что для того, чтобы разделить ваши тесты, вы можете захотеть
Используйте столько дополнительных файлов cpp (или того, что вы называете своими файлами реализации), сколько вам нужно для ваших тестов, но разбитых на разделы имеет смысл для вашего способа работы. Для каждого дополнительного файла нужно только #include "catch.hpp"
но в разделе примеры документации я не вижу такого варианта использования, как мой. Я прочитал эту запись в блоге, в которой описывается три решения, которые мне не нравятся: определение функций как макросов или создание функций static
или inline
.
Есть ли другой способ скомпилировать эти файлы, чтобы получить один исполняемый файл с основной функцией, определенной test_main.cc
?
inline void something_great() {
. Это проблема повторяющихся символов. В остальном все хорошо. Или переместите его вtest_utils.cc
и укажите только объявление в заголовке. - person balki   schedule 15.03.2019