У меня возникает ошибка компоновки, которую я не могу понять, и это происходит только с некоторыми разработчиками (может быть, потому что мы используем несколько разных версий библиотек или компиляторов):
undefined reference to `CodeAttributes::AddCodeAttribute(boost::variant<boost::blank, A, B, C > const&)'
Весь вопроскласс и функция довольно просты, но я не могу сделать самостоятельный пример из-за зависимостей от других классов.
Это объявление класса:
class CodeAttributes : public SomeMixinClass<CodeAttributes>
{
public:
CodeAttributes();
CodeAttributes(const CodeAttribute& codeAttribute);
void AddCodeAttribute(const CodeAttribute& codeAttribute);
CodeAttribute GetCodeAttribute() const;
// other stuff
Тогдатип CodeAttribute
является typedef следующим образом:
typedef boost::variant<boost::blank, A, B, C> CodeAttribute;
И реализация опять довольно проста:
void CodeAttributes::AddCodeAttribute(const CodeAttribute& codeAttribute)
{
m_CodeAttribute = codeAttribute;
}
CodeAttribute CodeAttributes::GetCodeAttribute() const
{
return m_CodeAttribute;
}
CodeAttributes::CodeAttributes(const CodeAttribute& codeAttribute)
: m_CodeAttribute(codeAttribute)
{}
CodeAttributes::CodeAttributes()
: m_CodeAttribute(boost::blank())
{}
Класс компилируется как статическая библиотека, и я получаюПриведенная выше ошибка связывания при использовании функции из модульных тестов проекта, использующего статическую библиотеку для сборки исполняемой программы.Вызов функции выглядит следующим образом:
CodeAttributesPtr x(new CodeAttributes);
x->AddCodeAttribute(A());
Я не знаю, в чем может быть проблема, но я попробовал следующее:
- Если я закомментирую вызовс функцией сеттера, она связывается правильно, поэтому, кажется, есть только одна проблемная функция: сеттер.С геттером все в порядке.
- Так как я немного растерялся, я попытался вызвать функцию как-то иначе, например
x->AddCodeAttribute(x->GetCodeAttribute());
или передать boost::blank()
или CodeAtrribute(boost::blank())
.Он все равно не может соединиться так же. - Я мало знаю о библиотеках или объектном коде, но я попытался запустить
objdump
для объектного кода и статической библиотеки.Я обнаружил, что функция существует, но аргумент CodeAttribute
является boost :: variable с аргументами шаблона определения (как и ожидалось), , но , за которым следует множество boost::detail::variant::void_
аргументов, которые не являютсяв typedef.Я не знаю, является ли это просто деталью реализации boost::variant
, но похоже, что она того же типа, что и функция получения, так что, вероятно, все в порядке?
Я не знаю, чтоиначе я мог бы посмотреть, в чем и где проблема.