리눅스에서 기본적인 C 또는 C++ 컴파일 하기

윈도우즈에서는 일반적으로 Visual C++로 소스 코드를 작성하고 컴파일을 한다. 그리고 무료 컴파일러를 안다면 Dev C++ 또는 Eclipse을 사용하기도 한다.

리눅스도 마찬가지로 이러한 IDE(Integrated Development Environment)를 가지고 있다. Eclipse는 윈도우즈 뿐만 아니라 리눅스도 지원하고 있으며, 다른 IDE로는 Code::Blocks, KDevelope 등이 있다.(추가적인 것은 http://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments 참조)

하지만 여기서는 이러한 잡다한(?) 기능이 많이 들어 있는 IDE보다는 콘솔 창에서 gcc를 이용하여 컴파일하는 방법에 대해서 소개하겠다.



그 전에, 소스를 코딩해야 하는데, 만약 윈도우즈를 포함하여 위 IDE들이 없다면 아주 단순한 텍스트 에디터에서 코딩을 해도 된다.

C 소스 또한 텍스트 문자로 되어 있는 텍스트 파일이기 때문이다. 즉, 윈도우즈에서 메모장을 열고 소스를 코딩한 다음 .c 파일로 저장을 해도 c 소스 파일이 된다. 다만, 메모장 같은 단순한 텍스트 에디터의 경우 코딩을 하는데 많이 불편하기 때문에 안쓰는 것 뿐이다.
(윈도우즈에서 추천하는 고급 텍스트 에디터로는 Notepad++ 나 UltraEdit 등을 사용하면 된다.)

리눅스 또한 마찬가지로 기본적으로 내장되어 있는 텍스트 에디터를 사용하면 된다. 거의 모든 리눅스 배포판에 있는 텍스트 에디터로는 Vi나 Emacs 가 있다.

그러나 이들 에디터는 예전부터 쓴 만큼 당연히 GUI 에디터가 아니다. 따라서 이들 에디터는 윈도우즈 메모장처럼 바로 쓰기에는 약간 불편하다.(하지만 익히고 나면 매우 편리하고, GUI가 아닌 환경에서도 매우 강력하게 쓸 수 있다는 장점이 있다.)

우분투(Gnome 계열)의 경우 Gedit 이라는 기본 에디터가 있고, 쿠분투(KDE 계열)의 경우 Kate 라는 기본 에디터가 존재한다.

이들 에디터들은 메모장보다는 더 많은 기능이 포함되어 있고, 프로그래밍을 도와줄 수 있도록 문법 강조 기능이나 들여쓰기 기능들이 존재한다.

Gedit이나 Kate 모두 메뉴 설정에 강조 기능이 존재해서, 적절한 언어를 선택해주면 문법 특징들을 강조해준다. Kate의 경우에는 더 기능이 강력하여 들여쓰기 및 정렬 기능까지 존재한다.

어쨌든, Vi나 Emacs를 쓰면 좋겠지만, 당장 코딩을 해야 하거나 앞의 에디터들이 불편하다면 Gedit이나 Kate를 사용해도 된다.



이제, 소스 코딩을 할 수 있는 에디터를 알았으므로 코딩을 완료하고 소스 파일을 저장하자.

그 다음 gcc를 이용해서 소스를 컴파일하면 되는데, 먼저, gcc가 있는지 확인해보자.

우분투의 경우 프로그램에서 터미널을 열고(쿠분투는 Konsole) gcc -v 를 입력하여 gcc의 버전이 출력되는지 확인해보자. 버전이 출력된다면 gcc가 있는 것이고 출력 되지 않는다면 gcc가 없다는 것이다.

우분투 10.10의 경우 기본적으로 내장되어 있지만 쿠분투의 경우 gcc가 설치되어 있지 않으므로 KPackageKit에서 gcc를 검색하여 설치를 해주자.
sudo apt-get install gcc    // c 컴파일러 설치
sudo apt-get install g++    // c++ 컴파일러 설치



이제 gcc 까지 준비가 되었으므로 컴파일을 해보자.

컴파일을 하려면 소스 파일이 있는 위치를 알려줘야 하는데, 파일이 있는 위치를 알려주기보다는 직접 이동한 후 그 위치에서 명령을 입력하는 것이 더 편하므로 폴더를 먼저 이동하자.

폴더를 이동하는 방법은 cd(change directory) 명령이다. "cd 폴더 경로"를 입력해주면 그 폴더로 이동이 된다.

예를 들어 cd /usr/share 라고 쳐주면 최상위 폴더인 / 폴더 내에 usr 내에 share 폴더로 이동한다.(참고로 윈도우즈는 최상위 폴더가 C 드라이브이지만 리눅스는 루트 폴더인 / 이다.)

또는, "cd 폴더" 만 입력해주어도 현재 위치에 있는 폴더로 이동하게 된다.

참고로 폴더 경로에서 ..은 상위 폴더를 의미하고, . 은 현재 폴더를 의미한다. 즉, /usr/..의 의미는 / 와 같다. 그리고 이후에 파일을 실행할 때 ./ 을 입력하게 되는데, 이것은 현재 폴더를 의미한다. 즉, ./file 은 현재 폴더에 있는 file을 의미하게 된다.



이제 폴더를 이동했으니, 진짜 컴파일을 해보자. 기본적인 gcc 컴파일 방법은 gcc file이다. 그러면 소스 파일을 컴파일하여 실행 파일 하나를 내놓는데, 기본 이름이 a.out으로 되어 있다.

만약, 이것을 실행하고자 한다면 ./a.out 을 입력해주면 된다.

간단하게 이렇게 컴파일하고 이름을 변경해도 되지만 좀 더 강력한 기능을 사용하기 위해 다음과 같이 컴파일할 수 있다.
gcc -W -Wall -O2 -o file src1.c src2.c
위 명령어는 src1.c 와 src2.c 파일을 컴파일 해서 file 이라는 이름으로 실행 파일을 만들으라는 것이다.

-W 와 -Wall 옵션은 경고를 출력하라는 의미인데, 이것을 붙이지 않으면 에러일 경우에만 gcc가 컴파일을 중단하고 출력을 해준다. 경고도 보기 위해서는 위 옵션을 적절하게 사용하면 된다.

그리고 -O2 는 최적화 옵션으로 2단계 최적화를 하겠다는 것이다. 옵션 종류로는 -O0, -O1, -O2, -O3, -Os 가 있다. 가장 많이 쓰는게 -O2이고, -O0 는 최적화 하지 않겠다는 것으로 기본값이다.

위와 같이 소수의 파일만 있을 때는 저러한 명령으로 컴파일 해도 되지만 c 파일이 많아 진다면 파일 명을 입력하는 것이 귀찮아질 것이다.

간단하게 src1.c src2.c 부분을 *.c 로 고쳐주면 현재 폴더 내의 모든 c 파일을 컴파일하게 된다.
(참고로, .h 파일은 추가해주지 않아도 링커가 알아서 연결해준다.)

그리고 gdb(디버거)를 사용하게 된다면 -g 옵션을 추가해서 디버깅 정보를 삽입하도록 명령을 내릴 수 있다.

이 정도만 알고 있어도 C를 공부하거나 간단하게 컴파일할 때 바로 적용하여 사용할 수 있다.

참고로 위 명령어를 계속 쓰다보면 당연히 지루하고 불편한 작업이 될 수 밖에 없다. 따라서 나같은 경우 위 명렁어를 하나의 별칭으로 지정해서 간단하게 사용한다.

홈 폴더(계정 폴더)에 .bash_aliases 파일(.을 반드시 붙여주자)을 생성한 다음 그곳에 다음 내용을 추가해주자.
alias fgcc='gcc -g -Wall -W -O0 -o ./file ./*.c'
그러면 fgcc 명령만 입력하더라도 현재 폴더 내에 있는 모든 C 파일을 컴파일 하여 실행 파일 file로 만들게 된다.

위 명령에서 필요한 부분을 적절하게 변경해서 사용하며 된다.

마지막으로 C++에서도 gcc와 똑같이 사용하면 되는데, gcc 대신 g++를 사용하면 된다.



이 외에 더 필요한 것들은 gcc 맨페이지(man gcc 명령)를 참고하여 사용하면 된다.

그리고 큰 프로젝트처럼 파일 종류가 많아지고, 폴더까지 필요해진다면 makefile을 작성하여 사용하면 된다.

댓글 1개:

  1. 정말 쉽고 편하게 컴파일할 수 있는 방법을 알려주셔서 고맙습니다^^

    답글삭제