У меня есть перегрузка <<
оператор, определенный в (VC++ 2013) DLL, который компилируется нормально:Linker Error для перегрузки оператора ostream (VC++ 2013)
Определение:
__declspec(dllexport) friend std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs);
Реализация:
std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs)
{
os << rhs.toString();
return(os);
}
DLL содержит еще 50 методов, включая несколько перегрузок операторов, которые компилируются и связывают штраф.
Однако программа, использующая dll, не может связать метод для < <.
Он объявляет перегрузки <<
как
__declspec(dllimport) std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs);
Код компилируется нормально. Но это не будет ссылка:
ошибка LNK2001: неразрешенный внешний символ «__declspec (DllImport) класс станд :: basic_ostream> & __cdecl сообщений :: Оператор < < (класс станд :: basic_ostream> &, класс обмен сообщениями :: ComplexMessage const &) «
Все другие методы DLL link fine. Кто-нибудь знает, почему возникает эта ошибка компоновщика?
EDIT Это отличается от предлагаемого дублирующегося вопроса. Символы определены в коде DLL и синтаксически компилируются; однако он не связывается. Это говорит о том, что либо код для этого конкретного оператора < < перегрузки не генерируется, либо генерируется, но не правильно найден. Я уверен, что это что-то простое, но я ударился головой об этом.
Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved- external-symbol-error-and-how-do-i-fix) –
может что-то поймать, если вы укажете в обоих местах пространство имен без имени ':: operator <<'. Это одна из проблем, которые я видел, это прототип в пространстве имен, а определение в другом/none. Это не даст ошибок компиляции. (Скорее всего, дадут предупреждения, пропустили ли вы все свои предупреждения?) Чтобы быть ясным, это не исправит, но может помочь диагностировать его. – Jfevold
Используйте файл .h для объявления экспортируемых функций. Таким образом, вы не можете случайно использовать неправильное имя пространства имен. Хрустальный шар говорит, что он не определен в * обмене сообщениями *. –