본문 바로가기

Dev. OS

리눅스에서의 컴파일

1. 컴파일이란?


대부분의 경우 프로그램을 만들때에는 사람이 이해하기 쉬운 언어로 만들게 됩니다.
그러나 이것은 사람이 쉽게 이해하기 위한 언어일 뿐이며, 컴퓨터가 이해할 수 있는 언어는 아닙니다.따라서 사람의 언어로 된 코드들을 컴퓨터가 이해할 수 있는 코드로 변환해주는 작업을 해야 되는데 이러한 작업을 "컴파일 작업" 이라고 합니다.
그리고 사람의 언어로 된 코드들의 집합을 원시코드 혹은 소스(Source)라고 부르며 리눅스의 경우
원시코드들은 대부분 C로 만들어지게 됩니다. 이 때 사람의 언어로 된 원시코드를 컴퓨터가 이해할 수 있는 코드로 변환해주는 일을 하는 프로그램을 "컴파일러" 라고 부르며, 리눅스의 경우 gcc가 가장 널리 사용되고 있습니다.

2. 컴파일의 과정


① 압축풀기
용량이 큰 프로그램은 여러개의 소스들로 이루어지며 보통 배포 될때에는 tar / gzip 압축을 이용해서 배포를 합니다. 따라서 소스 프로그램을 받았다면 적당한 디렉토리에 압축을 풀어줘야 합니다.

[root@localhost]# tar xfvz foobar.tar.gz


tar과 gzip을 이용해서 압축을 풀어 줍니다.

② 환경설정하기
이제 본격적인 컴파일 작업을 하도록 하겠습니다.
컴파일 작업의 첫번째는 configure 라는 스크립트를 실행하는 것입니다.
이 스크립트는 현재 사용되는 OS의 종류, 커널버전, 컴파일러의 종류 및 버전, 그리고 기타 여러가지 시스템의 환경을 알아낸 뒤에 시스템에 적당한 환경파일(Makefile)을 만들어 주는 일을 합니다.

[root@localhost]# ./configure


또한 configure 스크립트에는 여러가지 다양한 옵션을 사용하실 수도 있습니다.
이러한 옵션은 보통 README 파일이나 INSTALL 파일 등에 기록되어 있는 경우가 많으며,
혹은 configure --help 라는 옵션을 이용해서 여러가지 사항을 확인할 수도 있습니다.

[root@localhost]# ./configure --prefix=/usr/local/foobar



이렇게 configure를 성공적으로 수행하게 되면 Makefile 이란 환경파일이 만들어지게 됩니다.
이 파일에는 컴파일 환경에 대한 규칙들이 기록되어 있으며 컴파일러는 이 규칙들을 참조하여
소스코드들을 컴파일 하게 됩니다. 이부분이 실제적인 컴파일 과정이라고 보시면 됩니다.
컴파일은 보통 make 명령을 통해 이루어 집니다.

[root@localhost]# make



성공적으로 컴파일을 마치게 되면 컴퓨터가 인식할 수 있는 프로그램 코드들이 만들어지게 됩니다.
이제 컴파일을 모두 마쳤으니 프로그램을 설치하기만 하면 모든 작업이 끝나게 됩니다.
이 작업은 최고관리자(root) 권한으로 실행되며 아래 명령어를 통해 설치를 할 수 있습니다.

[root@localhost]# make install



3. configure시 주의 사항


configure 스크립트를 실행하다 보면 많은 에러들을 만날수 있을 것입니다.
필자는 수많은 에러중에 가장 대표적인 에러를 예제로 들도록 하겠습니다.
보통 configure 과정에서 일어나는 많은 에러는 프로그램이 필요로 하는 공유 라이브러리를
발견하지 못했거나 혹은 설치가 되지 않았을 경우에 일어나게 됩니다. 예를 들어 KDE프로그램을 컴파일 하려고 하고 이 프로그램이 qt와 kdelib를 필요로 한다고 가정합니다. 그럼 configure 스크립트를 실행하게 되면 스크립트는 qt와 kdelib가 존재하지는지 여부를
체크하게 되는데 만약 두개의 라이브러리가 존재하지 않는 경우엔 아래와 같은 에러를 출력합니다.

[root@localhost]# ./configure
....
....
checking for qt... no
checking for kdelib... no



이럴 경우는 당연한 얘기지만 qt와 kdelib를 컴퓨터에 설치해주면 해결이 됩니다.
그러나 만약 분명히 qt와 kdelib를 설치 했는데도 위의 에러가 발생할 경우가 있다면
그것은 configure 스크립트에서 qt와 kdelib가 설치된 디렉토리를 찾지 못했을경우에 발생합니다.
따라서 이럴때는 configure 스크립트의 옵션을 사용해서 직접 디렉토리를 지정하면 됩니다.

[root@localhost]# ./configure --with-qt=/usr/local/qt/lib --with-kde=/usr/local/kde/lib

[출처] http://twilight0119.tistory.com/51