최근 리눅스를 가지고 놀려고 하고 있습니다.
네트워크 프로그래밍을 하는데.. 역시 리눅스를 서버로, 윈도우에서 클라이언트를 가지고 놀기 위해...
하지만 컴퓨터가 한대 밖에 없으니

Virtual PC로 리눅스 환경을 만든뒤, 동시에 플밍 작업을 하려 했습니다만.

Visual PC는 MS에서 만든 프로그램.... 리눅스 설치가 간단치 않더군요.

특히 이런게 뜨니...  orz
인터넷에서 text 모드로 설치해라하고
노트북 주파수가 안맞는다니 하는것도 있고...
그냥 VMWare 를 쓰라고 하는데.. 이건 구하기도 힘들고, PC자원을 다 가져오긴 하지만.. 이런거 까지 하면서 쓰고 싶진 않고..

어쨋든..
설치법도 찾기 힘들고 해서... 이것 저것하다 설치에 성공해서 그 방법을 써볼려 합니다.

우선 아래의 wubi를 다운로드 합니다.
http://wubi-installer.org/

이 프로그램은 윈도우에서 유분투를 설치해주는 프로그램입니다.

그 다음, 윈도우 xp를 버추얼 pc로 설치 합니다.
여기서 중요한건 RAM을 512 이상으로 잡아 줘야 합니다
유분투 설치시 RAM 256을 필요로 하기에, 설치중 에러날 가능성이 있습니다.

그 다음,  인터넷에서 다운한 유분투(전 9.10 beta 버젼 (現2009-10-25 최신 버젼)을 마운트 시켰습니다.)


그리고 위 wubi 를 이쪽 Virtual PC 2007 안의 windowsXP 에 복사 한뒤 실행합니다.

Username 이나 Password를 설정해 주신뒤 Install 합니다.


인스톨 화면입니다. 이것만 한 1시간 반 걸리더군요 .. orz

거의 되면 재부팅 됩니다. 이때 마운트 해제를 해주셔야 하는건 당연!

재부팅 하면 위의 화면처럼 부팅시 메뉴가 나오는데 여기서 아래의 Ubuntu 로 진행


그리고 있으면
이런 화면이 뜹니다만...
걱정하지 마시고 기다려 봅니다.

전 한 5분정도 기다려서

이렇게 화면이 뜹니다



그리고 자기 맘대로 파티션 포멧하고


한동안 냈두면

화면 보호 모드인지.. 검은 화면이 나올떄도 있습니다만... 밑에 하드 돌아가고 있는거 봐선 먹통이 아닙니다..

잠시 다른 화면(버추얼 상태가 아닌 다른거) 하다 창돌리면, 다시 원상태로 돌아오더군요.

이거 설치도 한 1,2시간 걸린거 같습니다.
버추얼 PC에서 하는거니 참고 기다려 봅니다.



다 설치 되면 재부팅 되면서 다시 윈도우 or 유분투 설치 메뉴가 나오는데요. 유분투로 들어가 봅니다.
음 로딩화면 뜨고


그리고 유저이름과 암호 대라고 하네요.




아까 wubi에서 입력한 username 과 password를 무사히 입력하면 아래와 같이 유분투가 뜹니다.


음.. 이걸로 다시 놀것이 늘었습니다 ㅎ_ㅎ
저작자 표시 비영리 변경 금지
신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

EMPOS-II 라는 기기가 있습니다

(주 : 한빛전자의 EMPOS II 설명 http://www.hanback.co.kr/htm/sub2_2.htm)

임베이드 시스템 (CPU가 인텔 호환 계열 PC가 아닌, PDA나 휴대폰, 게임기에 들어가는 ARM 계열)의 프로그래밍을
교육 목적으로 만들어 졌다는 기계입니다 ... (;;;)

운영체제 시간때 프로그래밍으로 이 기계 가지고 게임을 만들라는군요.. (게임 공학과 답..)
뭐... CPU 400 Mhz 급... 렘 64MB .. 3D짓을 하면 일이 복잡하니.. 간단한 게임 만들자 해서...



일단 익숙한 윈도우 API 환경.. (임베이드 장비는 웬만하면 리눅스를 사용합니다.)으로 프로토 타입을 뽑았습니다.
30분 가량 대충 뚜둘겨 만든겁니다.. (컬러키니 뭐니 그런거 프로토 타입에 필요 없으니.. 애초에 이게 목적이 아니니)
(해당 소스.. API)

뭐 흔한 플래쉬 게임인 위에서 떨어지는 케릭터를 맞춰서 점수를 올리는
흔한... 낙하병 맞추기 게임 입니다.. (케릭터가.. 전혀 낙하산이 없지만;;;)

음.. 그 다음... 리눅스 기반의 프로그래밍은 vim을 사용하기에.. (전.. 이맥스 인가.. 그걸 씁니다. orz)
그래픽을 삽입하는법을 어떻게 할까 하다가...
예전 닌텐도 DS 만졌을때 윈도우 BMP 파일을 그쪽 NDS에 업로드 해서 띄울때 C언어, 즉 배열에다가 각 픽셀값을 다 때려박아 버리는 무식한 방법.. 이 떠올라

이전에 만든 프로그램을 좀 개조해서 EMPOS-II 에서 제대로 나오게 개조 했습니다.

음.. 이렇게 보니 무슨 암호문 같군요 ㅋㅋ 참고로 0xF81F 는.. 위의 RGB(255,0,255) 투명색을..
16진수상... 0xff00ff00를 각각 RGB 5,6,5 bit로 쉬프트 해서 연산한 결과 입니다.

그리고 여러 짓거리를 하고..
결국은 처음 API로 구현한 프로그램과 같은것이 EMPOS에 떳습니다.
배경 그림 ... 유성 떨어지는걸로 바꿧고...
마우스 클릭을, EMPOS 는 마우스가 없으니 터치 하면 격추한걸로 했고...
7-seg에 16진수로 맞춘 갯수를 표시하게 했고

적이 총 100여개 떨어지는데.. 100개 다 떨어지면 모니터상 (모니터닝 PC) 7-seg에 표시된 16진수를 10진수로 바꿔서 printf 하게 해놨습니다..

자세한건 아래 소스를 보시면...될거 같네요.. >_<;;

음...
main 이 picture_ex.c 파일입니다.
주석이 왜 영어냐면... 한글이 안써져서 입니다 ;;; 리눅스상.. 쩝..

중요 소스는..
// number 7-segment change function
unsigned char Getsegcode(int x)
{
 unsigned int code;
 switch(x)
 {
  case 0x0 : code = 0x3f; break;
  case 0x1 : code = 0x06; break;
  case 0x2 : code = 0x5b; break;
  case 0x3 : code = 0x4f; break;
  case 0x4 : code = 0x66; break;
  case 0x5 : code = 0x6d; break;
  case 0x6 : code = 0x7d; break;
  case 0x7 : code = 0x07; break;
  case 0x8 : code = 0x7f; break;
  case 0x9 : code = 0x6f; break;
  case 0xA : code = 0x77; break;
  case 0xB : code = 0x7C; break;
  case 0xC : code = 0x39; break;
  case 0xD : code = 0x5e; break;
  case 0xE : code = 0x79; break;
  case 0xF : code = 0x71; break;
  default  : code = 0; break;
 }
 return code;
}
숫자가 들어오면 해당 7-seg (디지털 숫자판의 각 led on off 비트 배열 숫자 입니다..)를 리턴하고...
음... 0에 대한 0x3f 값과  7에 대한 0x07 를 플래그로 하면 각각...  
0 :  8421 8421   | 7 : 8421 8421
      0011 1111   |     0000 0111  의 플레그 값이고 이걸 표로 하면

0 : 0x3f
   0 : on  
 5 : on   1 : on
  6 : off   
 4 : on   2 : on
   3 : on  

7 : 0x07   
   0 : on  
 5 : off   1 : on
  6 : off   
 4 : off   2 : on
   3 : off  
 음.. 뭐 대략 저런겁니다..

그림.. 이라 해봤자 적 케릭터 뿌리는 함수입니다.
void draw_image(int x, int y, int widht, int height, unsigned short *data)
{
 int n = 0;
 int i,j;

  for(j = y; j < height + y; ++j)
 {
  if(0 < y && y + height < LCD_HEIGHT)
  for(i = x; i< widht + x; ++i)
  {
   // draw image, but trancolor no draw
   if(0 < x && x + widht < LCD_WIDTH
    && enemy_data[n] != 0xF81F)
   {
    *(back_surface + (j*LCD_WIDTH + i)) = *(data + n);
   }
   ++n;
  } 
 }
}
빨간건, 투명색입니다.. 투명색이 아니거나 메모리 접근해선 안되는곳에 픽셀이 지정되면 그리지 않게 하는겁니다.

main 함수내.. 각 장치 초기화 및 메모리 접근 입니다..
 if( (fd_touch=open("/dev/touch", O_RDWR))<0 )
 {
  puts("device open fail");
  exit( 2 );
 }
 puts("init toutch!!");
 
 // set lcd system
 fd_lcd = open(FBDEVFILE, O_RDWR);
 if(fd_lcd < 0)
 {
  printf("Error fbdev open\n");
  exit(1);
 }
  
 // set lcd pointer
 real_surface =
  (unsigned short *) mmap(0, LCD_WIDTH * LCD_HEIGHT * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd_lcd, 0);
 puts("init lcd");

 // set 7-sement pointer
 for(i = 0; i< 2; ++i)
 {
  if((fd_led[0]=open("/dev/mem", O_RDWR | O_SYNC)) < 0)
  {
   printf("memory open fail\n");
   exit(1);
  }
  addr[i] = mmap(NULL, 1, PROT_WRITE, MAP_SHARED, fd_led[0], SEGADDR_1 + (0x00100000 * i));
 }
 puts("init 7seg");
 cnt = 0;
 print_7seg(cnt);
디버깅을 쉽게 하기 위해 초기화 완료되면 init 무엇 이라 했습니다.

다음..
while(Check_End())
 {
  tv.tv_sec = 0;
  tv.tv_usec = 10000;
  FD_ZERO( &rfds );
  FD_SET( fd_touch, &rfds );
  if( (judge = select(fd_touch+1, &rfds, NULL, NULL, &tv)) < 0 )
  {
   puts("select() fail");
   exit( 2 );
  }
셀렉입니다.. 음... 리눅스에선.. 소켓 뿐만 아니라 각 장치가 파일 시스템으로 (int)로 인식되므로 저런게 가능합니다.
대략.. 터치 스크린에 반응이 있으면 1 이상의 값이 judge로 저장 됩니다.. 만약.. -1 이 리턴되면 에러 겠죠

if( judge )
  {
   read( fd_touch, &p, 6 );
   if(p.flag == 0)
   {
    if(Check_Hit(p.x, p.y) == 0)
    {
     print_7seg(cnt++);
    }
   }
   
  // printf("\n(x,y,flag,byte) = (%.3d,%.3d,%d,%d)", p.x, p.y, p.flag, judge);
  }
  // output backscreen
  lmemcpy(back_surface, bg_data, bg_WIDTH * bg_HEIGHT * 2);
   
  // output enemy screen
  for(i=0; i<ENEMY_CNT; ++i)
  {
   if(Enemy[i].life == 1)
   {
    draw_image(Enemy[i].x, Enemy[i].y, enemy_WIDTH, enemy_HEIGHT, enemy_data);
    Enemy[i].y+=add;
   }
  }
  add > 30 ? add : add++;
  
  // copy to real lcd
  lmemcpy(real_surface, back_surface, LCD_WIDTH * LCD_HEIGHT * 2);
맨 윗부터.. 만약 반응이 있으면..... 이넘이 계속 눌려저 있는지 보고(치트 방지), 처음 눌려진거면, 해당 좌표 체크해서 7_seg의 숫자를 증가 시켜 갱신합니다.

다음... 반응이 있던 없던...
백스크린 버퍼에 배경 그림을 카피 하고
그 다음.. 적 스프라이트를 백 스크린 버퍼에 복사하고.
add 는... 떨어지는 속도 값입니다.. 처음에는 5만큰 떨어지다가 매순간 증감시켜서 30이 될때까지 증가 시키죠..
(즉 처음에 천천히 떨어지는 표적이 점점 일정 속도 까지 빨라지는겁니다..)

마지막에 이렇게 갱신된 백스크린의 그림을 리얼 스크린 (지금 LCD 포인터에 연결된 변수에..) 카피 합니다.

소스 자체는 간단하다고 생각되실지 모릅니다만..
리눅스 프로그래밍이라는것이.. vs 가 없어서.. vs에 찌든 사람들은 접근이 어렵지 않을까 생각되네요..
(디버깅 방법 이라던가... 리소스 켓치 라던가..)
신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

본 과제는 4학년 1학기 게임서버 프로그래밍 과목에서 했던 프로젝트 입니다.

환경은 아래와 같습니다.

OS

유분투 리눅스

Editer

Vi… 나중엔 Ultra Editer

System CPU

아마 펜티엄3 800Mhz 급으로 추정 ㅡ_ㅡ;;

SQL

MySQL

연결

Putty , Ultra Editer


과제의 요구사항

1. 가상의 2차원 공간에서 이동하며 서로 채팅 할 수 있는 시스템을 만든다
   가상공간의 크기는 x,y축 모두 -5000~ +5000 까지이며 meter 단위로 간주한다

2. 채팅서버는 telnet을 client로 이용한다 각 서버는 master mode와 slave mode로 실행이 가능하다

3. 한 채팅 서버 시스템에는 한 개의 마스터 모드 서버와 복수의 슬레이브 모드 서버가 존재한다.

4. 슬레이브 모드 서버는 클라이언트로부터의 telnet 연결을 처리하고, 마스터모드 서버와의 통신을 수행한다.

5. 마스터 모드 서버는 클라이언트로부터의 telnet연결을 처리하고, 필요한 DB access를 수행하며,
   슬레이브 모드 서버와의통신을 수행한다

6. 접속중인 전체 사용자의 모든 정보는 슬레이브 모드 서버에서도 유지되며, 접속중인 사용자에
   대한 중복 로그인 방지, /who 명령의 처리 등에 그 정보를 이용하여 마스터 – 슬레이브 모드 서버간
   통신량을 줄여야 한다.

7. 필요한 구체적 기능

  가. Login name/password를 DB에 저장(user table)
     telnet 연결후 로그인 / 패스워드 체크 후 일치할 경우만 입장 허용

  나. Login/logout 기록을 DB에 저장(log table)

  다. 중복된 로그인 체크/방지
     이미 로그인 한 사용자의 로그인 네임으로 로그인 할경우, 이미 사용중이란 메시지 띄우고 연결 해제.
     해당 로그인 클라이언트는 다른곳에서의 로그인 접속이 있다고 경고 메시지 보냄.
 
   라. 명령어.
      / 로 시작

명령어

기능

/user 

전체 사용자 목록

/who 

현재 접속중인 사용자 목록, 좌표등 관련 정보 표시

/who <login> 

특정 사용자의 정보
접속중 : 접속한시간, 현재 좌표 표시
접속중이 아닐 때 : 마지막 logout 시간, 그 좌표 표시

/passwd <password> 

패스워드 변경

/last <who> <num> 

사용자의 최근 사용내역 조회

/walk 

1m/s 속도로 전진. 3초마다 현재 위치 표시

/run 

10m/s 속도로 전진. 3초마다 현재 위치 표시

/stop 

현 위치에 정지

/toward <azimuth> 

방위각 전환(절대값)

/tleft <angle> 

왼쪽으로 <angle> 만큼 회전 (상대값)

/tright <angle> 

오른쪽으로 <angle> 만큼 회전(상대값)



   마. /toward, /tleft, /tright는 정지시에만 가능
  
   바. * '/'로 시작하지 않는 입력은 채팅 메시지로 간주

   사. 시야 내에 있던 상대방이 시야 밖으로 나가거나, 그 반대의 경우 이를 알려준다.

   아. 가시거리는 100m, 가청거리는 50m로 한다.

   자. 5분마다 현재 시간을 사용자에게 보여주도록 한다.
   
 8. 서버간 통신을 위한 패킷 구현 …

===========================================================================================
전 저기서 7번까지만 구현하구 GG 쳤습니다. ㅜㅜ
일정도 꼬였고.. visual studio로 소스 확인하면서 vi에 그대로 다시 치고.. make 하고…
어떻게 마스터 서버를 구현하고 슬레이브 만들려 하니... 좀 갈아 엎어야 하고..
기한 1주일 남았을 때.. ultra editer의 아주 편한 기능이 있었다는걸 알았을땐 ….
( http://rosagigantea.tistory.com/267 )


사용자 삽입 이미지

… 세상은 하얗더군요..

프로그램 자체는.. 정말 아주 단순한 심플한 게임서버 입니다.

제가 하는 에밀크로니클 온라인..(라그나로크 같은)처럼 3차원도 아니고
2차원에다가.. (아니.. 요즘 대다수 MMORPG 그래픽이 3D이지만 자세히 보면2D 좌표계…)
케릭터 뿌리는것도 없고
단지.. 이동만 가능. 그렇다고 케릭터 회전값이라던가 그런것도 없죠.
사거리에 따른 채팅 메시지 전달 (즉, 내 주변의 있는 클라이언트를 검출하는 알고리즘)
실시간 움직이고 있는 것을 예측하는 시스템(DRM)
DB와의 연동(MySQL)을 과부화 주지 말아야 하고(실시간 DB 저장보단 일정시간 후 저장)
네트워크 부하를 낮추기 위해 패킷을 한데 묶어 동시에 보내기(Queue)
사용자 감시를 위해 log table 따로 관리
중복 접속자 처리를 방지해야 하고..

음… 이런 복잡한 처리가 있는게 게임 서버 기술입니다 ;_;

신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

이클립스에서 시그윈의 gcc를 써서 프로그램을 개발하는건
간접적으로는 윈도 환경에서 리눅스 프로그래밍을 개발하는것과 비슷한 효과를 줍니다.

물론 윈도우 환경하에선 Visual Studio 에서 프로그래밍을 하는것이 가장 효과적이라 할수 있지만
세상 모든 프로그램이 M$의 윈도우에 도는 프로그램만 있는것이 아니니

좀더 넓게는 무료 OS, 리눅스 난잡한 버젼들이 퍼져 있기때문에,
.. 예를들어 PMP나.. PSP나... NDS나..  모바일 해킹 디버깅툴이라던가
대부분 리눅스 gcc등을 제공하죠..

즉 리눅스 프로그래밍을 해야 하고..
리눅스 프로그래밍이면 vi와 울트라 에디트라 생각합니다... (관련 :  http://rosagigantea.tistory.com/267)
물론 vi가 좋긴 한데... putty 작업이 아니라면 이클립스도 꽤 좋다고 해서
이클립스로 C언어 컴파일 하는 방법을 찾게 되었습니다.
(이게 아니면.. 코드 블락이라는 vc나 이클립스에 비해 상당히 프로그래머를 피곤하게 햐는 IDE를 써야 하기에;;)

서문을 대략... 이만 줄이고
이후 사진 설명입니다.

음.. 이건.. 이클립스 3.3 버젼으로 한겁니다. (2008.7.9일 기준 최신 이클립스)
뭔가.. http://www.eclipse.org/ 에서 language IDE 의 C쪽을 받아서 설치하는분도 계시는거 같지만..
뭐가 뭔지 잘 모르겠고... 걍 간단하게 기존 Java 이클립스에서 플러그인 설치 하는 방법을 설명 합니다.

그리고.. 이 이전에 시그윈이 설치되있어야 한다는 전재가 깔려 있습니다. 설치가 안되어있다면
http://www.cygwin.com/ 에서 시그윈을 설치 한뒤
윈도우 제어판 -> 시스템 속성 -> 고급 -> 환경변수 -> 변수의 Path 부분 맨 앞에 C:\cygwin\bin;C:\cygwin\usr\include; 을 추가해 줍니다.

<버젼 확인>

사용자 삽입 이미지

1. help-> software update -> find and install 을 합니다.
사용자 삽입 이미지

2. Search for new features to install
사용자 삽입 이미지

3. Europa Discovery Site 선택후 finsh
사용자 삽입 이미지

4. 플러그인 다운로드할 사이트를 찾습니다. 저기 카이스트를 선택해 줍니다.
사용자 삽입 이미지

5. 뭔가 마구 떴습니다.
 하지만 우리가 설치할 플러그인은 CDT 즉.. C/C++ Development Tools 입니다. 해당부분만 체크 합니다.
 Ruby 나... UML 관련 플러그인도 있으나... 현재는 CDT에 집중합니다.
사용자 삽입 이미지

6. 라이센스 동의를 구하는 페이지입니다.
사용자 삽입 이미지

7. 이제 설치할껏들 목록이 뜹니다. finish 를 눌러줍시다.
사용자 삽입 이미지

8. 뭔가 다운로드중~~
사용자 삽입 이미지

9. 헐 이것은 뭘까... 그냥 이전 버젼이 있는거 같은데 덮어쓸까요 정도로 보시면 됩니다..
  (증명서 동의 같은겁니다..)
  Install All 해줍시다.
사용자 삽입 이미지

10. 다 설치후 재시작 할꺼냐고 묻습니다. 당연히 재시작 합시다.
  한참뒤 안뜨면 윈도우 + D 키를 눌러서 워크스페이스를 이클립스 로고(작업표시줄에 안뜰때도 있습니다.)를 컨트롤 하던지.. 걍 다시 기동 시킵니다.
사용자 삽입 이미지

11. 기억상 보았던 맨 처음 OverView 와 동떨어진 디자인이 뜹니다.. 이렇게 나오면 반은 성공!
 상단 가운데쯤의 화살표를 눌러 워크 스페이스로 갑시다.
사용자 삽입 이미지

12. 별로 변한게 없는거 같습니다.
  정말 그런지 새 프로젝트를 만들어 봅시다.
  그냥하면 Java 프로젝트가 뜨니.. 맨 아래 other 를 눌러 들어갑니다.
사용자 삽입 이미지

13. 음.. 목표대로 C 프로젝트를 선택해서 컴파일 해봅니다.
사용자 삽입 이미지

14. 제일 고전적인 추억의 코딩... hello world 를 만듭니다.
   이클립스 하던식으로 프로젝트 이름만 적어주고 finish 클릭 
사용자 삽입 이미지

15. 음... 기본 소스가 나옵니다...
   이 예제는 puts 로 나오는군요..  printf로 교체하셔도 무방하겠죠..
   일단 컴파일 Ctrl + F11을 눌러봅니다.
사용자 삽입 이미지

16. 음.. 문제가 생기는군요..
   문제를 보아하니 cygwin1.dll 이 없답니다.
사용자 삽입 이미지

17. 뭐 이럴경우.. cygwin1.dll 파일이 없다는거니까....... 저 파일을 프로젝트 소스안에 복사를 하던지..
  걍 간단하게 windows\system32 방에 복사를 합니다.
  (하지만 배포할때  저 파일들을 같이 배포하셔야 하겠죠..)
  참고로 cygwin1.dll 파일은 cygwin\bin 디렉토리 안에 있습니다.
사용자 삽입 이미지
사용자 삽입 이미지

18. 음.. 복사도 했고 이젠 되는지 다시 컴파일 해봅니다.
  잘되는군요..
사용자 삽입 이미지


이후 약간의 팁... 굳이 안해도 됩니다.
Windows -> Preferences... 에 들어갑니다.
사용자 삽입 이미지

C/C++ -> New CDT project wizard -> Makefile Project -> Binary parsers 의 아래것들을 체크합니다.
사용자 삽입 이미지

erroe parsers 는 모두 체크 되있구요...
사용자 삽입 이미지

behaviour -> auto build 를 체크하면.. 리소스 저장할때마다 자동 디버깅을 해준다고 하네요..
사용자 삽입 이미지

뭔가 제가 못찾은거라서 그런건지 몰라도
이클립스에서 MinGW을 사용하여 컴파일 하는방법은 많지만
Cygwin을 사용하여 컴파일 셋팅하는건 그다지 없더군요....
(아니 원래 간단한거라 아무도 문제 제기하지 않은건가.. orz)

신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

출처 : http://shinnara.tistory.com/204

===================================================================================================

 조금 전에 스텔라리움이라는 오픈소스 천문 프로그램에 대한 소개글을 올렸습니다. 글에 써 있듯이 한글 문제로 인해 실행이 안되는 현상이 보였습니다. 그래서 오픈 소스인 만큼 소스를 받아서 고쳐볼까하는 생각을 하게 되었습니다. 평소에 Java 를 주된 개발 언어로 사용하다보니 C 와 관련된 툴은 거의 사용하지 않습니다. 이상하게도 저랑 C는, 특히 Visual C++ 은 별로 친하지 않더군요. 회사나 학교에서도 거의 Java 만 사용합니다.

 그런데 요즘 들어 오픈소스 커뮤니티에 대해 많은 관심을 가지게 되면서 C의 필요성을 크게 느끼고 있습니다. 그래서 예전 기억을 살려 다시금 C를 하려고 하는데, 그렇다고 Visual C++ 툴을 이용하고 싶지는 않았습니다. 평소에 자주 이용하는 Eclipse 를 개발툴로 정하고, Eclipse 에서 어떻게 하면 C를 사용할 수 있는 지를 알아보았습니다.

 Eclipse 의 홈페이지에 가보니 C 개발을 위한 CDT 라는 환경을 지원합니다. 특별히 다운받기 보다는 Eclipse 의 업데이트 과정을 통해서 설치를 할 수 가 있는데, 오늘자로볼 때 최신 CDT 버전은 4.0.1 입니다. (관련 페이지는 이곳 ) 그런데 4.0.x 는 Eclipse 3.3 이상에서 실행하도록 되어 있습니다. 제가 그동안 쓰고 있던 Eclipse 의 버전이 3.2 였던 관계로 이클립스를 다시 설치해야 했습니다. 오늘을 기준으로 최신 버전은 3.3.1.1 입니다.

설치를 하고나서, Eclipse Update 를 통해 CDT 를 설치합니다.  설치를 끝내면 다시 시작하라는 메시지가 나옵니다. Eclipse 를 다시 시작해 보니 다음과 같은 모습입니다.


사용자 삽입 이미지

사용자 삽입 이미지

Welcome 화면에 C/C++ Develpment 라는 항목이 생겨있네요.  File 메뉴에서도 C/C++ 을, Perspective 에서도 C/C++ 을 설정할 수 있습니다.

제대로 설치가 되었느지를 확인해보기 위해 helloworld.c 를 만들어보았습니다.

#include <stdio.h>

void main()
{
    printf("HelloWorld");
}

하도 오랫동안 C를 안써봤더니 이게 맞는 소스인지는 모르겠습니다. 별다른 메시지가 나타나지 않길래 Run 을 해보았습니다. 그런데 이게 왠일입니까? 다음과 같은 에러를 나타내며 실행이 안됩니다.

사용자 삽입 이미지

"Launch failed no binaries"
binary 가 없다면서 실행이 안되는다는 것입니다. 도대체 무슨 소린지... 그래서 CDT Help 를 찾아보았습니다.

C/C++ Development User Guide 의 가장 처음 문서 "Before you begin" 을 보니 다음과 같은 내용이 있습니다.

Windows

For windows, MinGW, and Cygwin are the two main choices for acquiring the GNU toolchain:

  • Cygwin is a port of the Linux environment to Windows. It provides a compatibility layer in a set of DLLs. These DLLs are GPL licensed, making any code that links to them also subject to the GPL. Cygwin, however, does provide the fullest implementation of the GNU toolchain by supporting the GNU libc C runtime library.


  • MinGW is a port of the GNU toolchain to the Windows platform. The biggest difference over Cygwin is that MinGW uses the Windows C runtime libraries (mscvrt) instead of GNU's libc. As a result, a compatibility layer is not required, thus avoiding the GPL issues with Cygwin. There are differences, though, between the Windows and GNU C runtime libraries that will make writing portable applications more difficult.

    However, MinGW provides the best integration support with the CDT due to it's direct support for the Windows environment.


    The following are instructions and links on how to install the current version of MinGW. Note that these links may become inaccurate over time as new versions of MinGW components are introduced. Please check the MinGW File Release section for the latest versions.


    1. Download and run the MinGW setup program, MinGW-5.1.3.exe.
    2. Select download and install the MinGW base tools and the g++ compiler. You may select the Current or Candidate version of these tools. You may also install any of the other available compilers as well.

      Do not install the MinGW Make feature as the MSYS version of make from step 5 is a more complete implementation of make.

    3. The MinGW setup program currently does not install the gdb debugger. To install the debugger, download the file from the following location: gdb-6.6.tar.bz2
    4. Extract the contents of the file gdb-6.6.tar.bz2 to the same location where you installed MinGW.
    5. If you want to use Makefile projects, download and run the setup program from the following location: MSYS-1.0.10.exe. MSYS provides an implementation of make and related command line tools. This is not required for other types of projects with the MinGW toolchain, which use CDT's internal build tools to perform the build

Windows 에서 CDT를 사용하기 위해서는 cygwin 이나 MinGW 가 필요하다는 것입니다. 그래서 MinGW 를 설치하였습니다.

MinGW 5.1.3 다운로드

저는 Automated MinGW Installer를 다운받아 실행했습니다. 설치를 하게되면 설치할 Component 를 선택하는 메뉴가 나오는데, 위의 설명에서와 같이 MinGW basetools 과 g++ compiler 를 선택합니다. 위의 설명에 보면 절대로 MinGW Make는 설치하지 말라고 나옵니다.

사용자 삽입 이미지

설치할 디렉토리를 선택하면 인스톨러가 설치 파일을 다운로드하여 설치를 해줍니다.

설치가 끝나면 디버거를 설치하는데요, 여기 에서 gdb-6.6.tar.bz2 를 다운받아 MinGW 의 설치디렉토리에 압축을 풉니다. 저의 경우, 몇몇 화일이 이미 존재한다고 나오길래 덮어썼습니다. ^^

Makefile 을 이용하기 위해서는 MSYS 를 설치합니다. 설치파일은 MSYS-1.0.10.exe

기본 설치가 끝나면 post-install 과정에서 mingw 의 설치 디렉토리를 d:/mingw 와 같은 형식으로 입력해줍니다.

그리고 나서 Eclipse 를 새로 시작하여 새 프로젝트를 생성해봅니다.

C Project 를 시작하려하니 오른쪽 toolchain 에 MinGW GCC 라는 것이 보입니다.

사용자 삽입 이미지

제대로 동작하는 지를 알아보기 위해 Hello World ANSI C Project 를 선택합니다.

Project Wizard 가 끝나고 나면 소스 코드를 볼 수 있는데 다음과 같이 바꿔보았습니다.

/*
 ============================================================================
 Name        : helloworld.c
 Author      : Shinnara
 Version     :
 Copyright   : It's Free
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    puts("Hello World! I'm Shinnara"); /* prints !!!Hello World!!! */
    return EXIT_SUCCESS;
}


Run 을 해보니 역시 제대로 동작하는 군요. 블로그에 올리기위해 이클립스를 프레임을 잔뜩 줄여봤는데 모습이 이상하군요. 어쨌든 제대로 동작하는 것을 확인할 수 있습니다.

사용자 삽입 이미지


이제 개발환경이 갖추어졌으니, 멋지게 개발하는 일만 남았네요. Eclipse, 참 좋은 개발 환경입니다 ^^

===================================================================================================

음.. 참고로 이클립스는 자바용 이클립스로 하면되고, C IDE 이클립스를 사용하면 설정이 안먹히는거 같다.
굳이.. Visual Studio 가 있는데 이클립스로 하려는 이유는...
모바일 게임기 계열이 리눅스프로그래밍을 많이 하는데, 리눅스 프로그래밍에선 vi 아니면 이클립스 for linux 만 있지... VS는 없기 때문.. orz
신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소