2013-02-01 2 views
2

안녕하세요. 내 IDE Visual Studio 2012에 문제가 있습니다. SDL을 배우기 시작 했으므로 새로운 기능이므로 SDL을 사용할 때 좋은 구조를 적용하려고합니다. 클래스로 SDL을 사용할 때 문제가 발생합니다. 내가 main에 모든 것을 입력하면 잘 작동합니다. 난 당신이 여기에 도움이 잘못하고있는 무슨 모르는 오류 클래스가있는 SDL

1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _exit already defined in LIBCMT.lib (crt0dat.obj) 
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: ___iob_func already defined in LIBCMT.lib(_file.obj) 
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _fclose already defined in LIBCMT.lib(fclose.obj) 
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 
1>C:\Users\User\documents\visual studio 2012\Projects\Nebula\Debug\Nebula.exe : fatal error LNK1169: one or more multiply defined symbols found 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

#include <SDL.h> 
#include "System.h" 

int main(int argc, char* argv[]) 
{ 
    System RedObject; 
    RedObject.SetUp(); 

    SDL_Quit(); 
    return 0; 
} 

두 번째 파일

홈페이지에 문제가있는 경우 여기에 내 코드가

입니다.

#include "System.h" 

System::System() 
{ 
} 

System::~System() 
{ 
} 

void System::SetUp() 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); // The SDL Set up bit. 
    SDL_Surface * screen; 
    SDL_WM_SetCaption("Window Name", NULL); 

    fullscreen = false; 

    if(fullscreen == true) 
    { 
     screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE | SDL_FULLSCREEN); 
    } 
    else 
    { 
     screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); 
    } 

    bool running = true; 

    while(running) 
    { 
     SDL_Event Event; 

     while(SDL_PollEvent(&Event)) 
     { 
      switch(Event.type) 

       case SDL_QUIT: 
        running = false; 
       break; 
     } 

     SDL_Flip(screen); 
    } 
} 

두 번째 파일 헤더 : 그게 문제의 경우

또한 내가 다중 스레드 DLL에서 실행하는 IDE 코드 생성기를 설정 한
#ifndef SYSTEM_H 
#define SYSTEM_H 

#include <SDL.h> 

class System 
{ 
    private: 
     int SHeight, SLenght; 
     bool fullscreen; 

    public: 
     System(); 
     ~System(); 
     void SetUp(); 
}; 

#endif 

(/ MD)는 모르겠어요. 죄송합니다.이 질문에 이미 대답 해 주시면 답변을 찾을 수 있습니다. 미리 감사드립니다.

+1

보인다. SDL에/MD 버전이 있습니까? 디버그 CRT (/ MDd)를 사용하고 있습니까? C++ ABI 문제는 다음과 같이 기뻐합니다 :-) – Cameron

+1

@Cameron : "MS DLL 연결의 즐거움"이라고 말해야한다고 생각합니다. 영향을받는 라이브러리는 C++ ABI와는 거의 관련이 없습니다. 대부분 C – rodrigo

+0

입니다. SDL을 설정하여 버전이 무엇인지 어떻게 알 수 있습니까? 고마워요. 전에는 이런 실수가 있었지만, 이번에는 정말로 푹푹 듭니다. –

답변

0

나는 그것을 알아 냈다! 이 문제는 SDL로 객체를 만들 때 두 개의 lib가 충돌 할 때 그 중 하나를 무시해야 할 때 발생합니다. LIBCMT.lib를 무시해야합니다. 여기에 어떻게 해야할지 모르는 경우 :

  1. 프로젝트의 속성 페이지를 엽니 다.

  2. 링커 폴더를 클릭하십시오.

  3. 입력 페이지를 클릭하십시오.

  4. 특정 기본 라이브러리 무시를 선택하고 편집에 들어가서 LIBCMT.lib을 넣고 확인을 누른 다음 설정을 적용하면 잘 수행해야합니다.

나는이 당신에게 고통 :)의 일을 저장 희망

SDL을 사용하고있는 한 (/ MD)와 다른 CRT에 대해 컴파일 된 것처럼
0

Visual Studio의 .NET Framework는 루트 수준 네임 스페이스로 System을 사용하므로 아마도 이름 충돌이 발생한다고 생각합니다. 클래스 이름을 System이 아닌 다른 이름으로 지정하십시오.

+0

그는 .NET을 사용하지 않습니다. – Cameron

+0

죄송합니다. 작동하지 않아 죄송합니다. ( –

+0

Cameron, 아마도 .NET을 사용하려고하지는 않았지만 Visual Studio 프로젝트를 만든 방법에 따라 빌드에 여전히 포함될 수 있습니다. 무관 한 해결책, 그래서 나는 이것이 문제가 아니었다 고 생각한다. – Raptor007