Ошибка при включении заголовков Boost в файлы .h, но не в файлы .cpp - PullRequest
0 голосов
/ 29 декабря 2018

Я имею дело со странной проблемой.У меня есть код, где мне нужно реализовать несколько макросов, используя Boost typeindex framework.Поскольку мои макросы включены только в заголовочный файл, я бы хотел, чтобы #include <boost/type_index.hpp> включался в заголовочный файл только так:

#include <stdexcept>
#include <boost/type_index.hpp>

#ifdef L4N_DEBUG
#define ERR_MSG(msg) std::string(boost::typeindex::type_id_with_cvr<decltype(*this)>().pretty_name()) + "::" + __func__ + "(): " + msg + " (" +__FILE__ + ":" + std::to_string(__LINE__) + ")"
#else
#define ERR_MSG(msg) std::string(boost::typeindex::type_id_with_cvr<decltype(*this)>().pretty_name()) + "::" + __func__ + "(): " + msg
#endif // L4N_DEBUG

#define THROW_RUNTIME_ERROR(msg) std::runtime_error(ERR_MSG(msg))
#define THROW_LOGIC_ERROR(msg) std::logic_error(ERR_MSG(msg))
#define THROW_INVALID_ARGUMENT_ERROR(msg) std::invalid_argument(ERR_MSG(msg))
#define THROW_NOT_IMPLEMENTED_ERROR(msg) std::logic_error(ERR_MSG("This function is not implented." + msg))

Но я получаю ошибку

/home/martin/MyProject/include/../src/DataSet/../Exception/Exceptions.h:9:10: fatal error: boost/type_index.hpp: No such file or directory

Ошибка исчезает, когда я перемещаю директиву включения из заголовка Exceptions.h в файлы .cpp, где включено Exceptions.h.Конечно, я указываю пути включения следующим образом:

add_library(
    MyLib

    ${LIB_TYPE}

    Neuron/Neuron.cpp
    Neuron/NeuronBinary.cpp
    Neuron/NeuronConstant.cpp
    Neuron/NeuronLinear.cpp
    Neuron/NeuronLogistic.cpp        
    Network/NeuralNetwork.cpp        
    Network/NeuralNetworkSum.cpp        
    NetConnection/ConnectionFunctionGeneral.cpp        
    NetConnection/ConnectionFunctionIdentity.cpp        
    LearningMethods/ParticleSwarm.cpp
    LearningMethods/GradientDescent.cpp
    DataSet/DataSet.cpp
    ErrorFunction/ErrorFunctions.cpp
    Solvers/DESolver.cpp
    Exception/Exceptions.cpp
    CSVReader/CSVReader.cpp
    CrossValidator/CrossValidator.cpp
    NormalizationStrategy/NormalizationStrategy.cpp
)

target_include_directories(
    lib4neuro

    PUBLIC
        ${ROOT_DIR}/include

    PRIVATE
        ${EXPRTK_INCLUDE_DIR}
        ${SRC_DIR}
        ${Boost_INCLUDE_DIRS}
)

Есть ли способ правильно указать пути включения также для файлов .h, а не только для .cpp?

1 Ответ

0 голосов
/ 29 декабря 2018

В конце концов было полезно прочитать все сообщение об ошибке более внимательно:

In file included from /home/martin/MyLib/include/../src/DataSet/DataSet.h:17,
                 from /home/martin/MyLib/include/myapi.h:10,
                 from /home/martin/MyLib/src/examples/net_test_1.cpp:12:
/home/martin/4Neuro/include/../src/DataSet/../Exception/Exceptions.h:9:10: fatal error: boost/type_index.hpp: No such file or directory
 #include <boost/type_index.hpp>

Как мы видим, Exceptions.h был неправильно включен в DataSet.h, который является частью API.Поэтому компиляция не удалась при попытке скомпилировать код в исполняемых файлах с использованием библиотеки, а не при компиляции самой библиотеки.

...