Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

통합개발환경

리눅스 환경에서의 프로그램을 작성하기 위해서는 컴파일러(:12), 링커, 에디터, 버전관리(:12), 소스코드 분석기와 같은 툴들을 독립적으로 사용해야 한다.

예를 들자면 vi(:12)로 코드를 작성하고, gcc(:12) 컴파일러를 이용해서 컴파일 한후, ld(:12)를 이용해서 링크해서 실행가능한 프로그램을 작성한다. 여기에서 끝나는게 아니다. gdb(:12)를 이용해서 디버깅하고, 소스코드를 네비게이션하기 위해서 ctag(:12)를 사용하고, cvs(:12)나 svn(:12)을 이용해서 버전관리를 한다.

최종적으로는 doxgen(:12)등을 이용해서 문서화까지 해야 한다. 정신이 없다. 프로그램하나를 만들려면 대략 10개 정도의 개발툴에 대한 사용방법을 알고 있어야 한다.

이렇게 분산된 개발환경을 잘 끌어모아서, 통일된 환경을 만들어보자 라고 해서 만들어진게 IDE(통합개발화경) 이다. 윈도우에서의 VC++, 파워빌더 등이 통합개발환경을 지원하는 툴이다. 이들 프로그램은 하나의 툴에서 코드작성, 테스트, 디버깅, 네비게이션, 버전관리를 할 수 있도록 환경을 조성한다. 개발자는 쓸데없는데, 신경을 안써도 되니 그만큼 편리한 환경에서 개발에만 집중할 수 있게 된다.

일반적인 리눅스에서의 개발환경

유닉스와 리눅스에서는 전통적으로 IDE 환경에 의존하기 보다는, 여러개의 툴을 다루는 개발자의 능력에 전적으로 의존했었다. 여기에는 장단점이 있을 수 있다.

장점이라면 개발자가 자신의 환경을 확실히 이해하고 - 이해해야만 한다 -, 프로그램 개발의 세부적인 것까지 직접제어할 수 있다는 점이 될 것이다. 또한 숙련만 되어 있다면, IDE를 이용하는 것보다 오히려 빠른 개발이 간능하다는 장점도 가진다.

단점은, 숙련되기 위해서 많은 시간이 걸린다는 점과 프로그래머 개인적성향과 역량에 의존하는 바가 크기 때문에, 통일되지 않는 결과물을 만들어 낸다는 점이 될 것이다. 특히 통일되지 않은 결과물을 만들어낸다는 점은 배포되는 프로그램을 만들경우 문제가 될 수 있다. 어떤 개발자는 스크립트로 실행파일을 만드는 반면, make(:12)를 이용하는 개발자, autoconf(:12)를 이용하는 개발자가 있을 것이기 때문이다. 이는 개발자간의 소통을 어렵게 하는 원인이 된다.

리눅스에서의 통합개발 환경

여하튼 리눅스나 유닉스도 통합개발환경을 활용하는 추세로 가고 있다. eclipse(:12)는 훌륭한 Java(:12 ) IDE툴이다. 그러나 C, C++을 위한 마땅한 환경은 없는 상황이다. eclipse(:12)의 확장 플러그인(:12)인 CDT(:12)를 이용하면, 어느정도 IDE환경을 흉내낼 수는 있지만, 사용해본 바로는 그리 권장할만한 환경이 아닌 것같다.

Kdevelop에 대해서

그러나 다행히도 C/C++진영에는 kdevelop는 툴이 있다. C, C++, Java, Ruby 등의 다양한 언어를 지원하는데, 현재 리눅스에서 사용할 수 있는 C/C++ IDE 중 가장 완성도가 높다고, 장담할 수 있다.

kdevelop 는 2007/9 월 현재 버전 3.4.2 까지 공개된 상태이다.

주요 기능

IDE가 가져야 되는 기본적인 구성요소를 포함하고 있다. 다음은 kdevelop가 지원하는 기능이다.

Version Control

cvs(:12), svn(:12)과 연동해서 버전관리를 할 수 있다.

소스코드 네비게이션

ctags(:12)를 이용해서 소스코드를 탐험할 수 있다.

class view

당연히 지원된다.

code completion

코드자동완성기능은 함수/변수/클래스의 일부만 입력했을때, 해당 이름을 포함하는 함수/변수/클래스의 목록을 보여준다. 이 기능을 이용하면, 오타에 의한 구문오류를 줄일 수 있다. 또한 변수/클래스/함수 명을 일일이 기억해내지 않아도 되므로, 개발시간을 단축시킬 수 있다.

컴파일,링크,디버깅

당연하지만 단축키 하나로 이러한 모든 과정을 끝낼 수 있다. 또한 코드를 보면서 break point를 지정하고, 각 변수가 가지는 값등을 추적할 수 있다. gdb를 이용해서 디버깅을 해본 개발자라면, 이러한 비쥬얼한 디버깅 환경이 얼마나 편리한 것인지를 느낄 수 있을 것이다. 이들 기능을 이용하기 위해서는 gcc, ld(:12), gdb가 설치되어 있어야 한다.

autoconf

개인적으로 kdevelop를 추천하는 이유가 gdb의 프론트엔드 디버깅 환경을 제공한다는 것과, autoconf를 이용해서 프로젝트를 관리해준다는 것 때문이다. 이외의 다른 기능은 있으면 괜찮은 부가기능일 뿐이다.

물론 make(:12)를 이용하면, 어느 정도 수준에서 프로젝트를 관리할 수는 있지만 autoconf(:12)에 비하면 많이 부족함을 느낄 수 밖에 없을 것이다. autoconf는 특히 프로그램을 소스코드와 함께 배포하거나 공유하고자 할때 강력함을 발휘한다. 운영체제, 배포판, 컴파일러에 따라 거기에 적당한 makefile 을 생성해주며, 필요한 라이브러리(:12), 프로그램(:12)에 대한 체크, 더 나아가서 운영체제 종속적인 define 문까지도 체크해주기 때문이다.

이렇듯 강력한 기능을 제공하는 autoconf 이지만, 좀 문제가 되는 점이있으니, 사용하고 이해하기가 상당히 난해하다라는 점이다.

kdevelop를 이용하면, 이러한 문제를 한키에 해결할 수 있다. project 만들기 클릭하면, 자동으로 autoconf 환경을 만들어 주기 때문이다. 개발자는 자신의 개발 환경에 맞게, 만들어진 파일에 몇줄 정도 더 추가시켜 주면 끝이다.

kdevelop의 autoconf의 활용방법은 뒤에 예제를 이용해서 따로 다루도록 하겠다.

최적화된 QT 개발환경

kdevelop는 QT(:12)개발환경과 궁합이 잘 맞는다. qt에서 제공하는 designer(:12)와 함께 사용하면, 비주얼한 환경에서 GUI(:12)응용을 제작할 수 있다. 자세한 내용은 QT 미니사이트의 문서를 참고하기 바란다.

autoconfig 기능 활용

kdevelop에서 프로젝트를 생성하는 것은 매우 간단하다. kdevelop를 실행하고 Menu > Project > New를 선택하면, 프로젝트 위자드 화면이 뜬다. 여기에서 프로젝트에 맞는 성격의 템프릿트를 선택한다음 몇번 클릭하는 정도로 간단하게 프로젝트를 생성할 수 있다.

이렇게 프로젝트가 생성되면, autoconfig 환경이 만들어진다. 그렇지만 만들어지니 autoconfig는 기본적인 내용만 담고 있기 때문에, 프로그램의 필요에 따라 약간의 수정을 해줘야 한다.

예를들어서 만들고자 하는 프로그램이 pcap(:12)과 pthread(:12) 라이브러리를 필요로 한다고 가정해보자. 이 프로그램을 소스까지 전부 배포하고자 한다면, configuration 스크립트에서 pcap와 pthread 라비르러리가 있는지 검사해서 Makefile(:12)를 생성하도록 해야할 것이다. 만약 이들 라이브러리(:12)가 존재하지 않는다면, configure 스크립트는 라이브러리 체크 에러메시지를 출력할 것이고, 프로그래머는 이 정보를 이용할 수 있을 것이다.

체크할 라이브러리의 추가는 configure.in 을 수정하면 된다. 다음과 같은 방법으로 라이브러리가 있는지와 라이브러리가 특정 함수를 지원하고 있는지를 체크하기 위한 룰을 만들 수 있다. 동일한 라이브러리라도 버전에 따라서 지원되지 않는 함수가 있을 수 있으므로, 라이브러리 체크를 위해서 유용하게 사용할 수 있을 것이다.
...
AM_PROG_LIBTOOL

AC_CHECK_LIB(pcap, pcap_next)
AC_CHECK_LIB(pthread, pthread_create)
...

이제 kdevelop의 Build > Build Project를 이용해서, 위의 라이브러리 체크를 포함한 configure 파일을 생성할 수 있다. 이제 configure 스크립트를 실행하면 pcap와 pthread 라이브러리를 체크하는 것을 확인할 수 있을 것이다.
checking for pcap_next in -lpcap... yes
checking for pthread_create in -lpthread... yes

마지막으로 make(:12)를 실행하면, pcap와 pthread를 링크시켜서 컴파일하는 것을 확인할 수 있다.
$ make
...
/bin/bash ../libtool --tag=CXX   --mode=link g++  -g -O2    -o mytest mytest.o  -lpthread -lpcap
g++ -g -O2 -o mytest mytest.o  -lpthread -lpcap
...

관련글