代码之家  ›  专栏  ›  技术社区  ›  Archie Mourad

文件C++中每个函数/变量的LNK1169和LNK2005[重复]

  •  -1
  • Archie Mourad  · 技术社区  · 2 年前

    我知道,SO上已经有很多类似的问题和解决方案,我读过它们,但没有一个能帮助我解决问题。

    我创建了一个日志类。 这是 Logger.h

    #ifndef LOGGER_H
    #define LOGGER_H
    
    namespace Logger
    {
    namespace debug
    {
    
        int Error = 0, OtherNumber;
    
        class log
        {
        public:     // Methods
            void Save();
    
        private:    // Members
            static int indentation;
            const std::wstring context;
            int Type, LineNumber;
    
        public:     // Constructor, Destructor
            log( const std::wstring& context, int LineNumber, int Type );
            ~log();
    
        };//class log
    
    }//namespace debug
    
    }//namespace Logger
    
    #endif //LOGGER_H
    

    Logger.cpp

    #include "stdafx.h"
    
    #include "Logger.h"
    
    namespace Logger
    {
    namespace debug
    {
        log::log( const std::wstring& ctx, int linenr, int type ): context( ctx ), LineNumber( linenr ), Type( type )
        {
            printf("\nLogging start! Context = %ls - Line = %d - Type = %d", context.c_str(), LineNumber, Type );
        }
    
        log::~log()
        {
            printf( "\nLogging end! Context = %ls - Line = %d - Type = %d", context.c_str(), LineNumber, Type );
            printf( "\nUsing Error here =%d", Error );
        }
        void log::Save()
        {
            FILE *fp = NULL;
    
            fclose( fp );
            fp = fopen( "mylogfile.log", "a" );
        }
    
    }//namespace debug
    
    }//namespace Logger
    

    然后在 main.h 我有:

    #ifndef MYAPP_H
    #define MYAPP_H
    
    #include "Logger.h"
    
    #define WIDEN2( x )     L ## x
    #define WIDEN( x )      WIDEN2( x )
    #define WFILE       WIDEN( __FILE__ )
    
    #define __STR2WSTR( str )   L##str
    #define _STR2WSTR(str)  __STR2WSTR(str)
    #define WFUNCTION       _STR2WSTR( __FUNCTION__ )
    
    #define DEBUGLOG_START( Type )  Logger::debug::log _debugLog( WFUNCTION, __LINE__, Type );
    #define DEBUGLOG_SAVE   { _debugLog.Save(); }
    
    #endif //MYAPP_H
    

    最后在 main.cpp 我有:

    #include "Test_UserPart.h"
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    DEBUGLOG_START( 1 )
    
    Logger::debug::OtherNumber = 10;
    
    _getch();
    return 0;
    }
    

    当我想编译它时,我会得到错误 error LNK2005: "int Logger::debug::Error" (?Error@debug@Logger@@3HA) already defined in Logger.obj ...MyApp.obj

    就我所见,我没有做任何循环包括。但为什么我会出现这个错误?

    谢谢

    0 回复  |  直到 10 年前
        1
  •  1
  •   Mike Seymour    10 年前

    您在标头中定义变量,当该标头包含在多个源文件中时,会导致多个定义。相反,请在标头中声明它们:

    extern int Error = 0, OtherNumber;
    ^^^^^^
    

    并在一个源文件中定义它们。或者停止使用全局变量。