SW

C언어 컴파일(compile)에 대한 생각 고찰 그리고 이해

S.Zinlee 2016. 7. 28. 22:08


compile은 *.c소스를 *.o파일로 변경하는 작업이다. 이때 각 *.c파일에 어떠한 함수가 있다라는 것을 단순 알려주기 위해 *.h파일이 필요하다
단순히 함수가 있다 정도만 알려 주기 때문에 컴파일시 이 *.h파일이 없을 경우에 어떤 함수가 정의 되지 않았다, 찾을 수 없다 등의 에러 메시지를 출력한다.

link의 경우는 이렇게 모인 *.o파일 들을 모아 주는 역할을 한다. 이때에 비로소 어떤 파일에서 사용하는 함수가 어떤 파일에 있다와 같이 참조(reference)하는 부분을 포함하게 된다. 그렇기 때문에 컴파일시 참조 하는 부분을 나타내는 헤더 파일을 include하고 참조하는 library의 위치를 옵션에 넣어줘야 문제 업이 컴파일이 가능하다. 만약 잘못 입려하거나 없을 경우 함수를 참조할 수 없다는 메시지를 출력한다.
library는 -L를 통해 해당 library의 폴더 위치를 넣고 -l를 통해 파일명을 넣어 준다.
-L를 해주지 않아도 컴파일러가 기본으로 찾아가는 순은 /usr/lib -> /lib -> /자기 폴더 순이다.

이렇게 묶인 link파일은 *.a나 *,so파일로 나뉜다. 둘은 목적에 따라 그때그때 다르게 사용한다.

*.a는 static library로서 정적 라이브러리에 해당한다. 정적 라이브러리의 목적은 빠른 접근(속도)에 있다. 하지만 처리속도를 높이기 위해 해당 라이브러리를 참조하는 모든 코드에 매칭되기 때문에 그만큼 용량을 많이 차지하게 된다.(라이브러리 용량이 호출하는 함수의 양만큼 증가) - 미리 빌드
*.so는 dynamic으로서 동적 라이브러리에 해당한다. 동적 라이브러리의 목적은 경량에 있다. 하지만 한번 빌드된 라이브러리의 위치를 각각 빌드시 명시되지 않고 사용시에 호출하여 쓰기 때문에 속도가 정적 라이브러리에 비해 떨어지는 단점이 있다. - runtime시 호출하여 사용
이는 시간과 공간의 반비례 그래프와 같다.