ошибка компоновщика на Cucumber-cpp при работе с несколькими файлами объектов

Я использую фреймворк BDD Огурцы-каст Некоторое время без особых проблем, но расширение набора функций модуля привело к появлению некоторых ошибок компоновщика.

Настроить:

  • Linux
  • Огурцы-каст
  • Makefile

Если я начну со следующего:

# ./test1.feature
Feature: test with a single cpp file

Scenario:
Given I'm a test
When a trig happens
Then light should be ON

а также

// ./step_definitions/f1.cpp
#include <boost/test/unit_test.hpp>
#include <cucumber-cpp/defs.hpp>

#include <iostream>

using namespace std;

GIVEN("I'm a test")
{
cerr << "Given..." << endl;
}

WHEN("a trig happens")
{
cerr << "Trig!" << endl;
}

THEN("light should be on")
{
cerr << "light ON..." << endl;
}

Когда я собираю это с помощью make, он генерирует тестовый двоичный файл без проблем, и выполнение через огурец работает как положено.

Но если я добавлю другой файл функции (который описывает другую функцию для тестирования)

# ./test2.feature
Feature: another set of feature to impl.

Scenario: extra code
Given I'm another test code
When a trig happens
Then light should be OFF

с соответствующим тестовым файлом,

// ./step_definitions/f2.cpp
#include <boost/test/unit_test.hpp>
#include <cucumber-cpp/defs.hpp>

#include <iostream>

using namespace std;

GIVEN("I'm another test")
{
cerr << "Given ANOTHER..." << endl;
}

компиляция этих двух файлов теперь приводит к следующей ошибке компоновщика:

$  make build
mkdir -p ./objs
mkdir -p ./build
compiling step_definitions/f1.cpp
gcc -c -g -O0 -DDEBUG -Wall -Werror  -DBOOST_ALL_DYN_LINK  -I/usr/local/include -o objs/f1.o -c step_definitions/f1.cpp
compiling step_definitions/f2.cpp
gcc -c -g -O0 -DDEBUG -Wall -Werror  -DBOOST_ALL_DYN_LINK  -I/usr/local/include -o objs/f2.o -c step_definitions/f2.cpp
building feature-test...
gcc  -DBOOST_ALL_DYN_LINK  -I/usr/local/include  -L/usr/local/lib -o feature-test objs/f1.o objs/f2.o -lcucumber-cpp -lboost_regex -lboost_system -lboost_thread -lboost_unit_test_framework -lboost_date_time
objs/f2.o: In function `toSourceString':
/usr/local/include/cucumber-cpp/internal/step/StepManager.hpp:161: multiple definition of `CukeObject0::cukeRegId'
objs/f1.o:/usr/local/include/cucumber-cpp/internal/step/StepManager.hpp:161: first defined here
objs/f2.o: In function `CukeObject0::body()':
/home/fred/dev/cuketest/step_definitions/f2.cpp:16: multiple definition of `CukeObject0::body()'
objs/f1.o:/home/fred/dev/cuketest/step_definitions/f1.cpp:15: first defined here
collect2: ld returned 1 exit status
make: *** [build] Error 1

Глядя на сгенерированные файлы obj, выдает следующее:

$  nm objs/f2.o | grep "cukeRegId"0000000000000395 t _GLOBAL__sub_I__ZN11CukeObject09cukeRegIdE
0000000000000000 B _ZN11CukeObject09cukeRegIdE
$  nm objs/f1.o | grep "cukeRegId"000000000000069e t _GLOBAL__sub_I__ZN11CukeObject09cukeRegIdE
0000000000000000 B _ZN11CukeObject09cukeRegIdE
0000000000000004 B _ZN11CukeObject19cukeRegIdE
0000000000000008 B _ZN11CukeObject29cukeRegIdE

Проблема выглядит так, как будто функции cukeRegId имеют одинаковое оформленное имя в 2 файлах obj, что вызывает ошибку компоновщика.
Теперь я застрял в том, как я могу предотвратить это.

0

Решение

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

1

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

Я знаю, что это старая тема. Но я просто хотел подчеркнуть самое простое решение, упомянутое на этом страница, и это должно поместить определение шага cuke в анонимное пространство имен.

0