Saturday, November 14, 2009

Eclipse 플러그인 스파이 기능

테크 트렌드

kenu kenu
2009-10-19 08:14:05.0
http://www.okjsp.pe.kr
Eclipse 플러그인 스파이 기능
---

이클립스의 플러그인 개발에 유용한 기능입니다. 3.4 부터 포함되었는데, 요즘 제 눈에 들어오는군요. 김성안님의 블로그에 잘 정리되어있습니다. http://pragmatic.kr/pages/1433164

Eclipse 3.4 Ganymede에 포함된 플러그인 스파이는 이런 문제를 한방에 해결해 줍니다. 다음의 두 단계만 따라하세요.

  1. 먼저 관심 대상 화면을 클릭해서 활성화 합니다.
  2. 그 다음 SHIFT + ALT + F1을 클릭합니다.

아래 화면과 같이 JUnit의 화면이 포함된 플러그인과 해당 클래스 이름 등을 표시해 줍니다. 짱입니다.

from: http://pragmatic.kr/pages/1433164

plugin 개발에 대한 수요가 조금씩 늘어나는 것 같은데 아주 추천할만한 기능입니다.

Thursday, November 12, 2009

gcc make 프로그램 한꺼번에 컴파일

조그마한 크기의 프로젝트가 아니라면, 하나의 프로젝트를 위해서 보통 4-6 개 혹은 수십개의 쏘쓰 파일로 이루어 진다. 이러한 중/대 규모의 프로젝트를 테스트하고 실행하기 위해서, 일일이 gcc 를 사용한 다는것은 상당한 노력과 신중함을 필요로하게 된다. 이러할때 Unix 에서 제공하는 "make" 를 사용하게 되면 프로젝트 관리를 좀더 수월하게 할수 있다. 이번 문서에스는 "make" 를 사용하는 방법에 대해서 알아보도록 하겠다.

만약 5개의 쏘쓰로 이루어진 프로그램을 테스트 하기 위해서 컴파일을 한다면 다음과 같은 방식을 사용해야 할것이다.

$ gcc -c 1.c
$ gcc -c 2.c
$ gcc -c 3.c
$ gcc -c 4.c
$ gcc -c 5.c
$ gcc -o myprg 1.o 2.o 3.o 4.o 5.o


매번 myprg 라는 실행파일을 만들어 내기 위해서 위의 방식대로 컴파일 하는건 보통 일이 아니다. 그나마 위의 경우는 간단한 형태이고 각종 gcc 옵션, library 링크 include 파일이 패스지정등이 들어가게 되면, 코딩하는 시간보다 컴파일 하는 시간이 더걸리는 사태가 벌어질것이다.

이러한 일련의 작업을 자동화 시켜주는 프로그램이 있으면 좋을것이다라고 누군가 생각을 했고 그래서 나온게 make 라는 도구(프로그램) 이다. make 를 사용하면 위의 모든 일련의 컴파일을 자동적으로 관리 해줄뿐만 아니라, 최근에 바뀐 쏘쓰만 컴파일해서 링크시켜주는 일까지 알아서 처리한다. 예를 들어 1.c 를 수정했다면 2.c, 3.c 4.c, 5.c 는 그대로 두고 단지 1.c 만을 컴파일 해서 object 파일을 만들고, 나머지 기존에 만들어져 있던 object 파일과 링크를 시켜준다. 그러므로 시간을 크게 절약할수 있으며, 프로그래머는 "어떻게 컴파일 될 것인가" 라는 부수적인 것에 신경쓰지 않고 코딩에만 전념할수 있다.

object 파일을 만들고 이들을 link 시켜서 최종 실행 파일을 만들기 위해서, 프로그래머는 보통 어떤 source를 필요로 하고, 어떤 헤더파일이 필요로 하는지, 그리고 어떤 라이브러리가 필요로 하고 있는지, 최종적으로 만들어질 실행파일의 이름이 무엇인지를 알고 있어야 한다. 마찬가지로 make 역시 "컴파일 규칙"을 알아야 할필요가 있다. 이러한 규칙을 정한 설정파일을 참조해야 하는데 보통 "Makefile" 라는 이름의 파일을 참조한다. Makefile 에는 해당 쏘쓰를 컴파일 하기 위해서, 어떤 컴파일러를 사용해야 하는지, 컴파일후 어떤 실행파일(Target) 를 만들어야 하는지, 각 object 파일의 의존성관계는 어떠한지, 컴파일시 어떤 헤더파일디렉토리와, 라이브러리를 참조할지 등에 대한 규칙을 담고 있다. 다음은 Makefile 의 간단한 형태이다.

1 CC = gcc
2 CXX = g++
3 CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG
4 CXXFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG
5 INCPATH = -I/usr/local/include/mysql
6 LINK = g++
7 LIBS = -L/usr/local/lib/mysql -lmysqlclient -lcrypt

8 # FILE
9 SOURCES = main.cc
10 sql.cc

11 OBJECTS = main.o
12 sql.o

13 TARGET = myprg

14 # Implict rules
15 .SUFFIXES: .cc .c

16 .cc.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
17 .c.o: $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<

18 # build rule

19 all: $(TARGET)
20 $(TARGET): $(OBJECTS)
21 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)

22 clean:
23 -rm -f $(OBJECTS) $(TARGET)
24 -rm -f core

25 # complie
26 main.o: main.cc
27 sql.o : sql.cc


각줄의 번호는 설명의 편의를 위해서 붙인거다.
언뜻 보면 쉘스크립트 언어와 꿰유사한 분위기를 풍김을 알수 있을것이다. make 에서는 make 파일의 내용을 쉽고 간편하게 작성하도록 하기 위해서 "매크로" 를 제공한다. 매크로의 사용은 shell 에서의 변수사용과 매우 비슷하다. 매크로명 = 매크로값 사용방법은 $(매크로명) 식으로 필요할때 불러쓰면 된다.


1 번줄 부터 13 번줄까지는 각종 매크로를 지정했음을 알수 있다.
15 번줄의 .SUFFIXES 는 파일의 확장자에 따른 컴파일 규칙을 정의해 주기 위해서 make 에서 내부적으로 제공하는 키워드로, 컴파일 규칙을 정의할 파일의 확장자를 적어준다.
16 - 17 번째 줄은 .SUFFIXES 에서 정의한 확장자를 위한 컴파일 규칙을 적용한 것이다. 16 번째줄은 .cc 에 대한 빌드규칙은 ":" 이하의 규칙에 따라서 컴파일을 하고, 컴파일후 만들어지는 object 파일은 확장자".o"를 붙여라는 뜻이다. 16 번째 줄을 매크로 치환을 해서 완전한 명령어로 바꾸어 보면 (sql.cc 를 컴파일한다고 가정하자) $ g++ -c -pipe -Wall -W -O2 -DNO_DEBUG -I/usr/local/include/mysql -o sql.o sql.cc 이 된다. 17 번째 줄의 경우는 확장자가 .c 인 파일에 대한 빌드 규칙인데, 이때는 g++ 대신 gcc 를 사용하도록 규칙이 정해져 있다.
위에서 보면 $@ 가 사용되었는데, 이는 타켓의 전체이름을 나타내는 생략형이다. .cc.o 에서 타겟의 이름은 파일명.o 로 하라고 지정되어 있음으로 sql.cc 에 대해서 $@ 는 sql.o 로 치환된다. 눈치 챘겠지만 "$<" 는 원래 파일 명을 나타낸다.

19-24 는 build rule이 정의되어 있다. make 프로그램에 아규먼트를 주는 형식으로 시행되는데, 아래와 같은 방법으로 실행한다.

$ make all
$ make clean


make all 명령을 실행하면 g++ 일 이용해서 실행파일을 만들어내고, make clean 을 실행하면 그동안 생성되었던 모든 오브젝트 파일과 core 파일을 지우게 된다. 물론 이러한 build 룰 같은것은 사용자가 필요로 할경우 얼마든지 새로운 기능을 추가시킬수 있다.

지금까지 make 의 사용법을 간단하게 나마 알아 보았다. 지금까지의 설명은 make 파일의 가장 일반적이고 간단한 사용의 방법이다. 그렇다고 하더라도 위의 정도만 사용할줄 알아도 대부분의 프로젝트 프로그램을 관리하는데에는 문제는 없을것이다. 이 문서에서 제공하지 않는 더 고급의 기능은 스스로 조금씩 배워나가면 될것이다.

다음번에는 Makefile 를 자동적으로 만들어주는 tmake 란 도구에 대한 문서를 제공하도 록 하겠다.

이전의 문서 "make 를 이용한 프로젝트 관리(1)" 에서 우리는 간단하게 나마 make 도구의 유용성에 대해서 알아보았다. 그렇긴 하지만 make 를 사용하기 위해서 Makefile 를 만드는 데에는 꽤 많은 시간이 든다.
이러한 문제를 해결하기 위해서 Makefile 을 자동적으로 만들어주는 tmake 란 프로그램이 있는데, 이번에는 tmake 를 사용해서 Makefile 을 쉽게 생성하는 방법을 알아보도록 하겠다.

tmake 는 QT를 제작한 회사로 유명한 troll 이라는 회사에서 배포하는 프로그램이다. 원래 tmake 는
QT프로그램을 위한 Makefile 를 생성하지만, 약간만 수정하면 쉽게 자신의 프로젝트에 맞는 kefile 를 만들수 있다.

우선 프로그램을 다운로드받는다.
다운로드 받은 파일은 적당한 디렉토리에 옮겨서 압축을 풀면 bin 디렉토리가 생성되는데, 여기에 있는 파일들중 progen 과 tmake 2개의 실행파일을 적당한 실행 디렉토리로(/usr/local/bin 과 같은) 복사해 준다.
그다음에 lib 디렉토리 역시 적당한 디렉토리(/usr/local/tmake/lib) 로 복사해준다.
이로써 tmake 를 사용하기 위해서 필요한 모든 파일의 설치가 끝이 났다. 이제 tmake 를 사용하기 위한 환경설정을 해주어야 하는데, 만약에 bash 쉘이라면 .bash_profile 에 아래의 내용을 포함시키도록 한다.
TMAKEPATH=/usr/local/tmake/lib/linux-g++
expotr TMAKEPATH


c 쉘이라면 .cshrc 파일을 수정하면 된다.

setenv TMAKEPATH /usr/local/tmake/lib/linux-g++


이로써 tmake 를 사용하기 위한 모든 환경설정이 끝났다. 이제 직접 tmake 를 이용해서 Make 파일을 생성시켜보도록 하겠다.

우선 Makefile 를 생성할 프로그램 쏘스가 있는 디렉토리로 이동한다. 그후 progen 을 이용해서 project 파일을 생성한다.

[yundream @localhost test]$ progen -o test.pro


progen 을 실행하면 test.pro 란 파일이 생성되었음을 알수 있을것이다. test.pro 는 프로젝트 파일로, 현재 디렉토리에 어떤 쏘쓰파일(.c .cc) 이있는지 어떤 헤더파일이 있는지에 대한 정보를 가지고 있다. tmake 는 이 파일을 참조 하여 Makefile 을 만들어낸다.
이제 tmake 파일을 실행해서 Makefile 를 만들면 된다.

[yundream @localhost test]$ tmake -o Makefile test.pro


위의 명령을 실행하면 tmake 는 test.pro 파일을 참조해서 Makefile 를 생성하게 된다.

이렇게 해서 Makefile 를 매우 쉽게 만들긴 했지만 tmake 가 모든것을 알아서 해주는 만능은 아니다. 게다가 서문에서 미리 말했듯이 tmake 프로그램이 원래 QT 응용 프로그램에 최적화되어 있기 때문에 약간 손을 봐줄 필요가 있다.
tmake 를 이용해서 생성된 Makefile 에서 LIBS 라인을 자신의 프로그램에 맞게 수정하면 된다.
그리고 MOC 와 UIC 는 필요 없는 라인이므로 삭제하면 된다.

수정전 LIBS = $(SUBLIBS) -L$(QTDIR)/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm
MOC = $(QTDIR)/bin/moc
UIC = $(QTDIR)/bin/uic


수정후 LIBS = -lcrypt -lm


물론 LIBS 부분은 사용자마다 달라진다.

이제 make 를 실행하기만 하면 test 라는 실행파일이 만들어진다. 이로써 tmake 의 사용방법을 알아보았다. tmake 가 완벽한 프로그램은 아니지만 프로젝트 관리를 위한 시간을 대폭 줄여줄것이다.

eclipse CDT console scanf 버그(windows환경)

eclipse CDT console scanf 버그(windows환경)

이클립스 CDT 콘솔 이용해서 실행시

아래와같이 scanf 함수가 있다면 아무것도 출력되지 않습니다.
먼저 입력을 한 이후 화면이 출력되는 현상을 볼수 있습니다.

----------------------------------------------------------------
#include

int main()
{
int nAge;
int nBirth;

printf("Age : ");
scanf("%d", &nAge);

printf("Age = %d\n", nAge);
return 0;
}
----------------------------------------------------------------

해결방법: printf나 출력문 이후에 버퍼를 비워줌 > fflush(stdout);
예)
----------------------------------------------------------------
#include

int main()
{
int nAge;
int nBirth;

printf("Age : ");
fflush(stdout);
scanf("%d", &nAge);

printf("Age = %d\n", nAge);
return 0;
}
----------------------------------------------------------------


버그에대한 수정답변
It is not easy to "fix" and it depends on the OS.

The line buffering policy for the stdio or for C++ iostream, is base on whether
or not the output stream maps to a real console or a pty for Linux user.

On Linux, we find a way to do this by creating a pseudo pty, this will
work for debug launch and normal launch(in most of the case).

On Windows, for the GDB backend we create a command console that is
associated with the application, this will work for debug launch.

On Windows for normal launch we have no solution, so the output will not
be line buffered. So yes this is still a problem for windows.

This bug was flip to fix because it was targetting Linux(Unix-All) and
a solution was provided.

The other comments are for windows and folks should make a new PR for it.

Wednesday, November 11, 2009

Eclipse와 MinGW를 이용한 C/C++ 개발 [ S/W 팁 & 사용법 ]


Eclipse와 MinGW를 이용한 C/C++ 개발 [ S/W 팁 & 사용법 ]

제목은 너무 거창하지만 간단히 Visual Studio 없이 이클립스를 이용한 C / C++ 개발 방법입니다.

이클립스는 이전 버전부터 C / C++ 개발을 위한 툴을 제공해 오고 있었습니다.
다만 컴파일러등을 같이 제공하고 있지 않아서 별도로 구해야 합니다.
돈을 지불할 수 없는 학생이나 개인들이 사용한다면 좋겠죠? =)

예전에 소개드렸던 Dev-C++과 비슷하다 생각하시면 됩니다.


1. 우선 GCC등의 컴파일러를 구해야 겠죠.
쉽게 MinGW를 구해서 설치합니다.
윈도우에서 Unix/Linux 개발 환경을 구성해주는 패키지입니다.

다운로드는 이곳 링크에서 받습니다.
가장 위에 있는 Automated MinGW Installer를 받으면 됩니다.
설치는 간단합니다. 설치할건 기본적으로 선택되어 있는 tool과 g++ compiler, MinGW Make 입니다.
원래는 패키지중 Current 버전을 설치해야 하는데 제 PC에선 설치가 되지 않아 현재 버전이 아닌 이전 버전을 설치했습니다.

모두 설치가 되었다면 확인이 필요하겠죠? 커맨드에서 아래 처럼 확인해 봅니다. 혹시 아래처럼 실행되지 않는다면 시스템 패스를 확인해 봅니다. 기본 경로에 설치했다면 C:\MinGW\Bin을 패스에 추가합니다.



2. 개발에 필수인 디버거도 필요하겠죠? =)
이곳에서 디버거를 다운 받습니다.
압축을 풀어보면 아래 그림과 같은 디렉토리가 보일겁니다.
MinGW 디렉토리랑 유사한 구조로 되어 있는데 그냥 덮어 쓰면 됩니다.
간단하죠?



3. 마지막으로 이클립스를 구해야 겠죠?
다운로드 페이지에서 C/C++ 버전을 다운받고 압축을 풀어 실행하면 됩니다.
간단한 테스트 코드를 만들고 컴파일하고 디버깅하고 실행해보면 되겠습니다.


Ps. 다른 분들은 make 관련 에러가 있다고 하는데 저는 이상하게 없네요.
만약 문제가 생긴다면 이클립스의 설정에서 make를 mingw32-make.exe로 변경해 보세요.



트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://namomo.egloos.com/tb/3965470 [도움말]

    덧글

    • 멋쟁이 2009/10/22 23:54 # 삭제 답글

      글 덕분에 해결 하였습니다. 글을 제 블로그에 담아 갈께요
      안되면 제 블로그에 삭제요청해 주시면 삭제 하겠습니다.
      감사합니다.
    • 냐모 2009/10/23 00:08 #

      네 출처만 남겨주시면 마음대로 가져가셔도 됩니다.
      도움이 되었다니 저도 기쁘네요.
      즐거운 하루 보내세요~

    re: C에서 char형으로 받은거 int형으로 변환하기!

    re: C에서 char형으로 받은거 int형으로 변환하기!

    kanghd132005.09.25 02:25

    우선 방법은 2가지가 있습니다.

    1) atoi 형을 이용합니다.

    #include

    #include

    void main()

    {

    char chr = '7';

    int a;

    a = atoi(chr);

    }

    2) 만약 숫자가 1자리수일 경우, '0'을 뺍니다.

    #include

    void main()

    {

    char chr = '7';

    int a;

    a = chr - '0';

    }

    그리고 덧붙여서 말하자면, int형을 char형으로 전환하는 방법을 (뽀나스로) 설명해드리겠습니다.

    1) 숫자가 1자리수인 경우 : 역으로 '0'을 빼는게 아니라 '0'을 더합니다.

    2) itoa를 이용한 경우.

    #include

    #include

    char chr[100];

    void main()

    {

    int a = 12345;

    itoa(a , chr , 10);

    }

    itoa( 숫자값 , 값이 들어갈 string 배열 , 숫자값을 변환할 진수 )

    입니다. 만약 숫자값이 5이고 뒤에 변환할 진수를 2진수라고 할 경우

    101이 값으로 들어가게 되겠죠.

    3) sprintf를 이용한 방법

    #include
    #include

    char chr[100];

    void main()

    {

    int a = 12345;

    sprintf(chr , "%d" , a);

    }

    sprintf( string 배열 , A);

    인데요. A 부분에는 printf 사용하듯이 하시면 됩니다.

    ★ itoa, atoi 을 지원하는 헤더파일로는 ctype.h, stdlib.h 등이 있습니다...

    물론 실력이 미숙하지만(...) 도움되셨는지요..?

    출처 : 지구 위의 60억 인간 중 한 명 OOO군의 머릿속

    Tuesday, November 10, 2009

    윈도우에서 MinGW + Eclipse를 이용해 C/C++ 개발하기

    회사의 PC에 작은소프트 눈에뵈는 개발도구를 설치하였는데, 도대체 뭘 잘못설치한건지 툭하면 블루스크린이 뜬다. 지우고 다시 설치하여도 또 에러가 난다-_-; 회사PC라 함부로 포맷을 할 수도 없다. 그리하여 GVIM을 깔고, 각종 플러그 인을 달아 왠만한 IDE급으로 쓰려고 하였으나, 이런저런 한계를 많이 느껴서 결국 Eclipse를 사용해보기로 결심하였다. 어제 오후와 오늘 점심시간의 삽질끝에 완성한 결과물이다. ㅋㅋ 간지~!

    1. MinGW를 설치한다.

    MinGW가 뭐하는 녀석이냐? 윈도우에서 GCC, MAKE등을 사용할 수 있게 해주는 녀석이다. 당연히 freeware이다. ㅋㅋ 검색엔진 아무 곳이나 mingw로 검색하면 쉽게 다운로드를 받을 수 있지만~ 나중에 이 포스트를 다시 보게 될 귀차니스트 '윤정원'을 위해 미리 링크를 걸어둔다. ㅋ
    [링크] : http://sourceforge.net/project/showfiles.php?group_id=2435

    사이트에서 Automated MinGW Installer를 다운받아 설치한다. 어떤 패키지를 설치할 것인가를 물어보는 창이 나오는데, 나는 Java Compiler와 Ada Compiler를 제외한 나머지 패키지는 모두 설치하였다. ~_~;

    C:\MING 에 설치를 하였을 경우 환경변수중에 PATH에 c:\mingw\bin을 추가해준다. 다른 디렉토리에 깔았다면 거기에 맞춰서 세팅하면 됨

    2. MSYS BASH를 설치한다.

    이녀석은 윈도우에서 Bash shell같은걸 지원하는 녀석인 듯 하다. (자세히는 잘 모르겠다. 요놈을 설치하지 않고도 잘 되었었는데, 모든 세팅을 완료한 후에 인터넷에서 검색한 문서에서 이녀석을 설치하라고 하여서 설치해 보았다. -_-;

    역시 mingw로 검색하여 소스포지에 가서 잘 찾아보면 MSYS Base System이라고 있다 요놈을 다운받아서 설치를 하되, i386용으로 다운받아 압축을 풀어보면 설치파일이 없고 lib, bin 같은 폴더만 멀뚱하게 놓여져 있다. 요놈들을 mingw가 설치된 폴더에 복사한다. 그럼 lib는 lib대로, bin은 bin대로 그밖에도 등등 알아서 나뉘어서 설치가 된다. 물론 최신버전이 아닌 이전버전은 설치파일(exe)이 있어서 이놈을 설치하여도 된다.

    3. Eclipse를 설치한다.

    Free IDE의 본좌라 감히 부를 수 있는 Eclipse~! 내가 자바를 혐오하다시피 하였을 시절엔 이녀석 역시 싫어하였지만, Android Project를 진행하며 이녀석의 강력함과 확장성에 탄복하였다 -_-ㅋ

    http://www.eclipse.org에 가서 C/C++ IDE용 Eclipse를 다운받는다. 이녀석은 그냥 압축을 풀면 바로 실행할 수가 있으므로 나같은 경우 c:\program files\eclipse에 압축을 풀어서 사용한다. 단 eclipse를 java로 만든 프로그램이므로 당연히 java run-time(JRE)이 있어야 하겠다. jre가 설치되어 있지 않으면 eclipse가 실행되지 않는다. JRE는 http://www.sun.com에 가서 다운받으면 된다.

    4. GDB를 설치한다.

    원래라면 MinGW와 함께 GDB를 설치하는게 순서상으로는 맞다. 위의 3번까지의 과정을 마치고 C/C++ 프로젝트를 만들어 빌드하여 실행을 해보니 아주아주 잘 되었다. 뭔가 분명히 삽질의 과정이 있어야 하는데 너무나도 잘되어 불안하기 까지 할 정도였다. -_- eclipse의 기능이 제대로 돌아가게 되어 심히 기분이 흐뭇하였다. 하지만 역시나 디버그가 문제였다. 괴상한 에러메세지를 내며 디버그가 되지 않아서 메뉴에 있는 온갖 세팅과 option을 건드려 보았지만 허사였다. 혹시나 해서 c:\mingw\bin에 가보니 gdb.exe가 없었다-_-; 아니 MinGW Automated Install을 했으면 당연히 디버거도 포함되어야 하는거 아닌가? -_-;

    아무튼 GDB를 다운로드하여 설치하니 잘~ 먹힌다 ㅋㅋ 후에 검색엔진을 뒤져보니 gdb를 설치하지 않아 디버그를 하지 못한 삽질을 한 사람이 나 말고도 여럿 있었던 것 같다 -_-;; 역시나 구글링이 대세다.

    5. Completed!

    간지나는 디버깅 +_+ㅋ

    아 그리고 네이버를 잘 애용하지 않는 관계로 아래의 링크를 나중에서야 알게되었다.
    http://cafe.naver.com/firstcpp.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4
    아주 자세한 설명이 되어있었다. 이거 보고 따라만 했어도 삽질 덜했을텐데 ㅋ