链接器声称该对象已定义

Linker claiming that object is already defined

本文关键字:对象 定义 链接      更新时间:2023-10-16

我有一个带有命名空间的头文件,在该命名空间中,我声明了多个事件和一个函数。在相应的.cpp文件中,我充实了为这些对象提供其属性的函数(对象是联合的)。但是,当我编译链接器时,链接器声称对象已经在main.obj中声明,而实际上它们还没有。我觉得这是我使用命名空间的问题,但我找不到任何指向该假设的内容。

.h

#pragma once
#include <SDL.h>
namespace UserEvents {

    /*Events for the StateMachine*/
     SDL_Event switchToEntryState;
     SDL_Event switchToIntroState;
     SDL_Event switchToGameState;
     SDL_Event switchToPauseState;
     SDL_Event exitState;
     SDL_Event shutdownStateMachine;

    bool initUserStates();
};

还有.cpp

#include "UserEvents.h"

using namespace UserEvents;
/*
SDL_Event switchToEntryState;
SDL_Event switchToIntroState;
SDL_Event switchToGameState;
SDL_Event switchToPauseState;
SDL_Event exitState;
SDL_Event shutdownStateMachine;
*/
/*
***********************************
USER EVENT CODE CHART
***********************************
EVENT CODE | MODULE
--------------------
0          | STATEMACHINE
*/

bool initUserStates() {
    //Attempt to register the number of events
    Uint32 userEventType = SDL_RegisterEvents(6); //Registering 6 custom events
    if (userEventType!= ((Uint32)-1)) {
        //Set up each event
        SDL_zero(switchToEntryState);
        SDL_zero(switchToIntroState);
        SDL_zero(switchToGameState);
        SDL_zero(switchToPauseState);
        SDL_zero(exitState);
        SDL_zero(shutdownStateMachine);
        switchToEntryState.type = userEventType;
        switchToIntroState.type = userEventType;
        switchToGameState.type = userEventType;
        switchToPauseState.type = userEventType;
        exitState.type = userEventType;
        shutdownStateMachine.type = userEventType;
        switchToEntryState.user.code = 0;
        switchToIntroState.user.code = 0;
        switchToGameState.user.code = 0;
        switchToPauseState.user.code = 0;
        exitState.user.code = 0;
        shutdownStateMachine.user.code = 0;
        switchToEntryState.user.data1 = (void*)0;
        switchToIntroState.user.data1 = (void*)1;
        switchToGameState.user.data1 = (void*)2;
        switchToPauseState.user.data1 = (void*)3;
        exitState.user.data1 = (void*)4;
        shutdownStateMachine.user.data1 = (void*)-1;

        return 1;
    }
    return 0;
}

#include头文件的每个文件都有自己的对象定义。这就是为什么有多个定义。

相反,您应该在标头中将对象声明为extern,然后具有包含这些定义的单个.cpp文件。extern说:"这只是一个宣言。该对象将在其他地方定义。