Я использую библиотеку yaml-cpp (v 0.6.0) для анализа файла конфигурации yaml.Yaml-cpp установлен как системная библиотека.
Я создал класс Parser
, который проверяет наличие пар ключ-значение в узле yaml.Класс Parser
построен как статическая библиотека ConfigParserLibrary
.
Теперь я хочу протестировать класс Parser
с использованием CppUTest
.Строим проект с CMake
.Пример кода:
CMakeLists:
cmake_minimum_required(VERSION 3.9)
project(yaml-parser VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ConfigParserLibrary lib
include_directories(${PROJECT_SOURCE_DIR}/include/config_parser_lib)
file(GLOB_RECURSE LIB_CONFIG_PARSER_SRC "config_parser_lib/Parser.cpp")
add_library(ConfigParserLibrary STATIC ${LIB_CONFIG_PARSER_SRC})
target_link_libraries(ConfigParserLibrary yaml-cpp)
# Executable that uses ConfigParserLibrary
add_executable(conf_reader "config_reader.cpp")
target_link_libraries(conf_reader yaml-cpp ConfigParserLibrary)
message(STATUS "Library tests will be built.")
add_library(ConfigParserTests STATIC tests/ConfigParserTests.cpp)
target_link_libraries(ConfigParserTests ConfigParserLibrary yaml-cpp)
add_executable(RunLibTests tests/RunTests.cpp)
target_link_libraries(RunLibTests CppUTest CppUTestExt
ConfigParserTests ConfigParserLibrary yaml-cpp)
add_test(NAME test_library COMMAND RunLibTests)
Когда я использую класс Parser в другом исполняемом файле, он компилируется без ошибок.Но когда я включаю файл config_parser_lib / Parser.hpp в файл ConfigParserTests.cpp, он вызывает: /usr/include/c++/8/optional:208: error: expected type-specifier before ‘(’ token
::new ((void *) std::__addressof(this->_M_payload))
^
.
Parser.hpp
#pragma once
#include <yaml-cpp/yaml.h>
class Parser{
public:
int parseNode(YAML::Node configNode);
};
Parser.cpp
#include "config_parser_lib/Parser.hpp"
int Parser::parseNode(YAML::Node configNode){
return valueA = configNode["keyA"].as<int>();
}
ConfigParserTests.cpp
#include <CppUTest/TestHarness.h>
#include "config_parser_lib/Parser.hpp"
TEST_GROUP(ConfigParserTests) {
};
TEST(ConfigParserTests, ParseConfigNode){
}
RunTests.cpp
#include <CppUTest/CommandLineTestRunner.h>
IMPORT_TEST_GROUP(ConfigParserTests);
int main(int ac, const char** av)
{
return CommandLineTestRunner::RunAllTests(ac, av);
}
В CMakeLists.txt
: когда я изменяю CMAKE_CXX_STANDARD
с 17 на 11, я получаю следующую ошибку /usr/include/c++/8/bits/stl_tree.h:636: error: ‘__node’ does not name a type
::new(__node) _Rb_tree_node<_Val>;
^~~~~~
.
Если я закомментирую строку #include "config_parser_lib/Parser.hpp"
вConfigParserTests.cpp
, ошибки нет.Таким образом, я думаю, что ошибка происходит от включения файла <yaml-cpp/yaml.h>
.Если я включу <yaml-cpp/node/node.h>
вместо yaml.h>
, ошибки не будет, но мне нужен файл <yaml-cpp/yaml.h>
, который включает другие заголовки, которые мне нужно использовать.
gcc версия 8.3.1 20190226.