erros de vinculação enquanto analisador separado usando boost spirit x3

Atualmente, estou tentando separar meu analisador boost spirit x3 em diferentes arquivos _def e .cpp usandoBOOST_SPIRIT_DEFINE/DECLARE/INSTANTIATE, mas continuo recebendo um erro de vinculação.AQUI é o meu analisador que está separado.

O erro do vinculador lê

<artificial>:(.text.startup+0xbb): undefined reference to `bool kyle::parser::impl::parse_rule<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::spirit::x3::context<boost::spirit::x3::skipper_tag, boost::spirit::x3::char_class<boost::spirit::char_encoding::standard, boost::spirit::x3::space_tag> const, boost::spirit::x3::unused_type>, boost::spirit::x3::unused_type const>(boost::spirit::x3::rule<kyle::parser::impl::identifier_class, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, false>, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, boost::spirit::x3::context<boost::spirit::x3::skipper_tag, boost::spirit::x3::char_class<boost::spirit::char_encoding::standard, boost::spirit::x3::space_tag> const, boost::spirit::x3::unused_type> const&, boost::spirit::x3::unused_type const&)'

O que estou fazendo errado? Como posso fazer meu exemplo funcionar?

config.hpp:

#include <boost/spirit/home/x3.hpp>

namespace kyle{
namespace parser{

namespace x3 = boost::spirit::x3;

typedef std::string::const_iterator iterator_type;
typedef x3::phrase_parse_context<x3::ascii::space_type>::type context_type;

}
}

literals.cpp:

#include "literals_def.hpp"
#include "config.hpp"
#include <boost/spirit/home/x3.hpp>


namespace kyle {
namespace parser {
namespace impl {

BOOST_SPIRIT_INSTANTIATE(identifier_type, iterator_type, context_type);

}
}
}

literals_def.hpp:

#include <boost/spirit/home/x3.hpp>
#include "literals.hpp"

namespace kyle {
namespace parser {
namespace impl {

namespace x3 = boost::spirit::x3;


const identifier_type identifier = "identifier";



auto const identifier_def = x3::alpha >> *x3::alnum;

BOOST_SPIRIT_DEFINE(identifier)
}
impl::identifier_type identifier(){
    return impl::identifier;
}


}
}

literals.hpp:

#include <boost/spirit/home/x3.hpp>

namespace kyle{
namespace parser{
namespace impl {
namespace x3 = boost::spirit::x3;

struct identifier_class;

typedef x3::rule<identifier_class, std::string> identifier_type;

BOOST_SPIRIT_DECLARE(identifier_type)
}

impl::identifier_type identifier();


}
}

main.cpp:

#include "literals.hpp"
#include <iostream>

template<typename Parser>
bool test(std::string str, Parser&& p, bool full_match = true)
{
    auto in = str.begin();
    auto end = str.end();
    bool ret = boost::spirit::x3::phrase_parse(in, end, p, boost::spirit::x3::space);
    ret &= (!full_match || (in == end));
    return ret;

}

int main(){
    auto b = test("fobar", kyle::parser::identifier());
    std::cout << b << std::endl;

}

questionAnswers(2)

yourAnswerToTheQuestion