googlemock - как мне решить проблемы с «множественным определением»? - PullRequest
0 голосов
/ 30 апреля 2019

В моем файле CMakeLists.txt у меня есть:

include_directories("${algorithm}/include")
add_executable(
        test_runner
        test_runner.cpp
        test_file1.cpp
        test_file2.cpp
        test_file2.cpp
)
target_link_libraries(
        test_runner
        gtest_main)
gtest_discover_tests(test_runner)

К сожалению, это не работает, так как оба этих файла импортируют algorithm.c из "${algorithm}/include".

Iне знаю, что здесь делать.Как я могу иметь несколько test_files, которые все зависят от algorithm.c, которые test_runner может обнаружить?

Я вынужден поместить все test_files в один файл или сделать отдельный исполняемый файл для каждого?Это было бы крайне неудачно.

Есть ли альтернатива?Я полагаю, что-то с заголовками?Или algorithms.c должна быть библиотека, которую я импортирую?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вы можете заключить включение исходного файла в дополнительный заголовочный файл , который имеет соответствующие защитные устройства.Что-то вроде:

// File: algorithm_test.h
#ifndef ALGORITHM_TEST_H
#define ALGORITHM_TEST_H

#include <algorithm.c>
#endif /* ALGORITHM_TEST_H */

После этого ваши тесты (test_file1.cpp, test_file2.cpp и т. Д.) Могут включать этот заголовок вместо непосредственного включения исходного файла:

// File: test_file1.cpp
#include <algorithm_test.h>

... define test methods ...
0 голосов
/ 30 апреля 2019

Вы можете использовать что-то, известное как охранник заголовка .Вы можете добавить

#ifndef ALGORITHM_C
#define ALGORITHM_C

в начало вашего кода и #endif в конец.Это сделает так, что файл будет скомпилирован один раз, затем он определит флаг ALGORITHM_C, и код никогда не будет перекомпилирован снова, независимо от того, сколько раз он включен.

Если вы не можете редактировать алгоритм.Можно подумать, добавив в файл analog.c вашу компиляцию, а затем создать надлежащий алгоритм attribute.h без кода, только сигнатуры функций, которые необходимо протестировать, затем поместите в этот заголовок средства защиты заголовков и включите этот заголовок.

...