добавление препроцессора определения в Cmake дает ошибку переопределения при вылове - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть простой тест, где я использую библиотеку catch2.Тест выглядит следующим образом:

#include <catch2/catch.hpp>
TEST_CASE("Pass Tests")
{
    REQUIRE(1 == 1);
}

Если мы хотим, чтобы catch использовал наш main.cpp вместо определения его собственного main, тогда мы должны добавить #define CATCH_CONFIG_RUNNER в main.cpp, но я хочу добавить это определениепрепроцессор в моем CMakeList, а не в main.cpp, так что вот мой main.cpp:

#include <catch2/catch.hpp>
int main(int argc, char *argv[])
{
      // bootstrap Catch, running all TEST_CASE sequences.
      auto result = Catch::Session().run(argc, argv);
      return (result < 0xFF ? result : 0xFF);
}

и мой CMakeList выглядит так:

set (CMAKE_CXX_STANDARD 11)
cmake_minimum_required(VERSION 3.10)
project(main)
include_directories(${CMAKE_SOURCE_DIR}/include)

file(GLOB_RECURSE sources main.cpp  Test.cpp)

add_executable (main ${sources})
target_compile_definitions(main PRIVATE -DCATCH_CONFIG_RUNNER)

Моя проблема в том, что когда я компилирую, я получаюошибки "множественные определения улова", но когда я добавляю #define CATCH_CONFIG_RUNNER непосредственно в main.cpp, это не дает мне никакой ошибки и работает отлично.Что я могу сделать, чтобы он работал с CMake, а не добавлял его в свой main.cpp?

1 Ответ

0 голосов
/ 28 сентября 2018

Только один исходный файл должен иметь определенный макрос CATCH_CONFIG_RUNNER.

target_compile_definitions добавляет определение для каждого исходного файла данной цели.В вашем случае это файлы main.cpp и Test.cpp.Таким образом, вы получаете ошибку «множественные определения».

Для добавления определений компиляции только для одного исходного файла установите свойство COMPILE_DEFINITIONS только для этого источника:

set_property(SOURCE main.cpp PROPERTY COMPILE_DEFINITIONS "CATCH_CONFIG_RUNNER")
...