.h file:
#if defined(_WIN32) && !defined(__GNUC__)
# ifdef LOGLIB_DLL
# define LOGLIB_DECL __declspec(dllexport)
# else
# define LOGLIB_DECL __declspec(dllimport)
# endif
#endif // WIN32
#ifndef LOGLIB_DECL
# define LOGLIB_DECL
#endif
...
class LogWay{
...
public:
virtual ~LogWay()=0;
private:
virtual void Write(const LogMessage&)=0;
};
class LOGLIB_DECL LogFile: public LogWay {
public:
LogFile(std::string strFilename);
private:
// virtual void Write(const LogMessage&);
std::ofstream m_ofile;
std::string m_strFileName;
};
.cpp file:
...
LogFile::LogFile(std::string strFileName): m_strFileName(strFileName)
{}
...
компилируется без ошибок (работаю в MSVStudio)
когда выбираю Rebuild Solution, получаю ошибку:
Linking...
Creating library F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.lib and object F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.exp
LogLibrary.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) const logspace::LogFile::`vftable'" (__imp_??_7LogFile@logspace@@6B@) referenced in function "public: __thiscall logspace::LogFile::LogFile(class std::basic_string,class std::allocator >)" (??0LogFile@logspace@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.dll : fatal error LNK1120: 1 unresolved externals
> Может для классов содержащих виртуальные функции есть какое то правило??
> такая же ошибка возникает на Linux
Здравствуйте, ioni, Вы писали:
I>судя по коду отсутсвует виртуальный деструктор базового класса
I>есть только определение
I>(или это просто не весь код)
Он присутвует. Оказывается проблема в другом. Я все закомментил. Причина проблемы — передача в конструктор параметра по умолчанию.
Следующий вариант не билдится:
namespace logspace {
enum Priority { info, warning, error, crit_error };
class LOGLIB_DECL LogMessage{
public:
LogMessage(Priority pr = error);
... };
}
зато вот такой вариант работает нормально:
namespace logspace {
enum Priority { info, warning, error, crit_error };
class LOGLIB_DECL LogMessage{
public:
LogMessage(Priority pr);
};
}
Все написанное в обычном приложении (не библиотеки) работает прекрасно. Хоть убей не пойму в чем же м.б. не то. Ошибка следующая:
1>LINK : F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.dll not found or not built by the last incremental link; performing full link
1> Creating library F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.lib and object F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.exp
1>LogLibrary.obj : error LNK2019: unresolved external symbol "public: __thiscall logspace::LogMessage::LogMessage(enum logspace::Priority)" (??0LogMessage@logspace@@QAE@W4Priority@1@@Z) referenced in function "public: void __thiscall logspace::LogMessage::`default constructor closure'(void)" (??_FLogMessage@logspace@@QAEXXZ)
1>F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.dll : fatal error LNK1120: 1 unresolved externals
1
и вот еще, также не позволяет зарбоатать в библиотеке:
class LogWay{
friend class Log;
public:
virtual ~LogWay()=0;
private:
virtual void Write(const LogMessage&)=0;
};
class LOGLIB_DECL LogFile: public LogWay {
public:
LogFile(const std::string &strFilename);
virtual ~LogFile();
private:
virtual void Write(const LogMessage&);
std::ofstream m_ofile;
std::string m_strFileName;
};
это все работает нормально, но аналогичный класс, выдает ошибку:
class LOGLIB_DECL LogConsole: public LogWay {
public:
LogConsole()
virtual ~LogConsole();
private:
virtual void Write(const LogMessage&);
};
в классе LogConsole — мне не нужны ни констуктор, ни деструктор (по умолчанию меня вполне все устраивает)...
хоть тресни не вижу в чем разница
1> Creating library F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.lib and object F:\avsokolov's documents\Visual Studio 2005\Projects\LogLibrary\Debug\LogLibrary.exp
1>LogLibrary.obj : error LNK2001: unresolved external symbol "private: virtual void __thiscall logspace::LogConsole::Write(class logspace::LogMessage const &)" (?Write@LogConsole@logspace@@EAEXABVLogMessage@2@@Z)
1>LogLibrary.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall logspace::LogConsole::~LogConsole(void)" (??1LogConsole@logspace@@UAE@XZ) referenced in function "public: virtual void * __thiscall logspace::LogConsole::`scalar deleting destructor'(unsigned int)" (??_GLogConsole@logspace@@UAEPAXI@Z)