ошибка при попытке проbuildеть библиотеку...
От: avsokolov  
Дата: 28.12.07 15:29
Оценка:
.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
Re: ошибка при попытке проbuildеть библиотеку...
От: ioni Россия  
Дата: 29.12.07 09:06
Оценка:
Здравствуйте, avsokolov, Вы писали:

судя по коду отсутсвует виртуальный деструктор базового класса
есть только определение
(или это просто не весь код)
Re[2]: ошибка при попытке проbuildеть библиотеку...
От: avsokolov  
Дата: 05.01.08 16:16
Оценка:
Здравствуйте, 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
Re[3]: ошибка при попытке проbuildеть библиотеку...
От: avsokolov  
Дата: 05.01.08 16:54
Оценка:
и вот еще, также не позволяет зарбоатать в библиотеке:


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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.