2011-02-04 7 views
1

log4cplus를 SDL과 함께 사용하여 작은 그래픽 응용 프로그램을 만들려고합니다.
Windows에서 minGW 및 Eclipse CDT를 사용하고 있습니다.로깅 라이브러리를 사용하는 경우 SDL에 창이 표시되지 않습니다.

내 문제는 라이브러리를 사용할 때마다 내 SDL 창이 표시되지 않는다는 것입니다. 대신 콘솔 [New Thread 2624.0x1270]에이 내용이 있습니다. 오류 메시지 없음, 컴파일/링크 문제 없음, 아무 것도 없음 (정밀도 편집 참조)
라이브러리를 사용하지 않으면 콘솔에 유사한 메시지가 나타난 다음 사라지고 내 SDL 창이 제대로 표시됩니다.

다음은이 동작의 예입니다. "Logger"로 시작하는 두 줄에 주석을 달면 모든 것이 정상입니다. 그렇지 않으면 SDL 창이 표시되지 않습니다.

편집 : 로깅 라이브러리를 사용하고 다른 모든 코드에 주석을 달았습니다.하지만 어떻게 든 실패합니다. 나는 로거 코드에 중단 점을 넣을 수 없다. 이클립스는 나를 알린다. 중단 점 속성 문제 : 설치가 실패했다. 코드가 실행되지 않는 것 같다.

* 편집 2 : * 잘못된 트랙에있었습니다. 아래 내 게시물을 참조하십시오. 문제의 종류가 해결되었습니다.

아이디어가 있으십니까?

#include <stdlib.h> 
#include <SDL/SDL.h> 
#include <SDL/SDL_endian.h> /* Used for the endian-dependent 24 bpp mode */ 
#include "Screen.h" 

#include <log4cplus/logger.h> 
#include <iomanip> 

using namespace log4cplus; 

int main(int argc, char **argv) { 

     if (SDL_Init(SDL_INIT_VIDEO) < 0) { 
      fprintf(stderr, "Impossible d'initialiser SDL: %s\n", SDL_GetError()); 
      exit(1); 
     } 

     SDL_Surface *screen; 

     screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); 
     if (screen == NULL) { 
      fprintf(stderr, "Impossible de passer en 640x480 en 16 bpp: %s\n", SDL_GetError()); 
      exit(1); 
     } 

    Logger root = Logger::getRoot(); 
    Logger log_1 = Logger::getInstance(LOG4CPLUS_TEXT("test.log_1")); 

     while(true) 
     { 
      SDL_Event event; 
      SDL_WaitEvent(&event); 

         switch (event.type) { 
          case SDL_KEYDOWN: 
           printf("La touche %s a été préssée!\n", 
             SDL_GetKeyName(event.key.keysym.sym)); 
            //SDL_Quit(); 
           break; 
          case SDL_QUIT: 
           exit(0); 
         } 

         Screen::DrawPixel(screen,20,20,200,10,10); 
     } 
} 
+0

위 코드에 대한 문제를 발견 했으므로 참고하시기 바랍니다. log4cplus를 사용하기 전에 초기화해야합니다. '#include '를 추가하고'BasicConfigurator :: doConfigure();'를 호출하면'std :: cout'에 로깅을 통해 최소한의 설정을 얻을 수 있습니다. – wilx

답변

0

나는 log4cplus과 경험이 없지만, SDL은 표준 출력 및 표준 오류의 일부 불쾌한 재배를한다는 것을 당신이 알아야 할 것을 알고있다.

로거 설정을 SDL_Init 호출 이후로 옮겨야한다고 말했지만 방금 SDL_Init 호출이없는 것으로 나타났습니다. 디스플레이를 설정하기 전에 SDL_Init을 호출 해보십시오.

+0

입력 해 주셔서 감사합니다. 내가 한 변경 사항을 반영하도록 코드를 수정했습니다. 아아,이 문제는 해결되지 않습니다. 이전과 SDL_Init 호출 직후에 로거를 선언하려고했지만 문제는 그대로 유지됩니다. SDL을 사용하여 무언가를 기록하고 싶을 때 사람들은 어떻게 일합니까 ?? –

+0

@David : log4cplus가 문제가 발생하면 나만의 로거를 작성하거나 다른 라이브러리를 사용해보십시오. :) – Xeo

0

문제점을 발견했습니다. 프로그램을 실행할 때 gdb가 나에게 주었던 오류를 알지 못했습니다. " gdb : 알 수없는 대상 예외 0xc0000135". 사실 프로그램은 전혀 시작되지 않았습니다.

이것은 경로 문제로 인해 dll을로드 할 수 없음을 의미합니다. 나는 log4cplus를 시스템 경로에 사용하는 dll을 넣으려고 시도했지만, 이클립스를 시작했지만 아무런 효과가없는 다른 해결 방법을 시도했다. 디버그 폴더에 dll을 두는 것만으로도 작동하는 것으로 나타났습니다.

이 gdb 오류의 문제점은 상당히 광범위합니다 (Google 참조). 이것은 적절한 수정이 아니지만 당분간은 함께 살 것이므로 문제가 해결 된 것으로 간주합니다.

+1

왜 그게 적절하지 않습니까? 필자가 보았던 대부분의 win32 배포판은 실행 파일 옆에 필요한 DLL을 번들로 제공합니다. 이상하게도 시스템 디렉토리에 고정시키는 것이 효과가 없었습니다. – genpfault