글
■ 프로그래밍에 사용할 수 있게 미리 만들어져 있는 함수나 변수들의 묶음
(1) 라이브러리의 개요
: 리눅스에서 프로그램을 개발하다 보면 여러 사람들이 함께 개발하는 경우가 종종 있다.
그 때 같은 기능을 여러 사람이 공동으로 사용하게 되는 경우가 있는데, 그러한 기능을 각각의 소스 프로그램에 함수로 넣어 사용하는 방법보다는 라이브러리를 만들어 함께 사용하면 여러가지 이점들이 있다.
- 사용하기가 훨씬 편리
- 같은 소스코드를 중복 기술하지 않아 효율적인 프로그램 작성 가능
- 다른 프로젝트에도 손쉽게 활용 가능
○ 기본적으로 제공되는 표준 라이브러리는 /usr/lib에 존재한다.
○ c 컴파일러는 프로그램 컴파일 시 기본적으로 이 디렉토리(/usr/lib)에서 라이브러리 함수를 찾아 링크 수행.
○ gcc 의 -L 과 -l 옵션을 이용하면 다른 디렉토리에 있는 라이브러리도 이용할수 있음 .
○ 라이브러리의 이름은 lib로 시작되며 라이브러리의 의미를 나타내는 이름 다음에 파일의 확장자 .a .so로 구성된다.
(ex) libm.a libm.so
여기서 m은 math 즉 수학관련 라이브러리를 의미한다.
이 라이브러리를 이용하여 컴파일 할때에는 다음과 같이 명령을 수행한다.
-> gcc sample.c -o -lm (libm -> l(ib)m)
(2) 라이브러리의 종류
: 라이브러리에는 정적(static)라이브러리와 공유(shared)라이브러리 두 종류가 있다.
■ 정적라이브러리
: 미리 만들어 놓은 라이브러리 함수의 오브젝트 코드를 ar 도구를 이용하여 아카이브로 만들어 놓은 것.
- 컴파일 과정 중 링크 단계에서 프로그램의 오브젝트 코드와 지정한 라이브러리의 오브젝트코드를 결합하여 하나의 실행 / 가능한 파일을 생성한다.
○ 이 정적 라이브러리 파일은 확장자로 .a를 가지며 이 라이브러리 함수를 이용할 때에는 관련된 헤더파일을 include하여 사용.
- 정적 라이브러리 생성방법
○ gcc -c mystatic.c : mystatic 파일의 오브젝트 코드를 생성한다.
○ ar rv libmystatic.a mystatic.o : ar명령을 이용하여 라이브러리 파일을 생성한다.
○ 위 명령을 치면 libmystatic.a 파일이 생긴다.
정적 라이브러리 함수 호출예
○ 정적라이브러리 함수를 호출하면서 컴파일을한다.
○ gcc mymain1.c -o mymain1 -lmystatic -L.
○ 여기서 -lmystatic -L. 는 현재 파일에 있는 라이브러리를 쓴다는 뜻이다.
○ 위에서 -L 과 -l (소문자 엘) 옵션을 이용하면 다른 디렉토리에 있는 라이브러리도 이용할 수 있음.
■ 공유라이브러리
: 정적 라이브러리를 이용하여 실행 파일을 생성하면 실행 파일에 라이브러리 함수의 코드가 포함된다. 따라서 이 라이브러리 함수를 여러 프로그램에서 사용하면 각각의 실행 파일에 라이브러리 함수의 코드가 포함된다.
따라서 이 라이브러리 함수를 여러 프로그램에서 사용하면 각각의 실행 파일에 라이브러리 함수의 코드가 포함되고 동일한 함수의 코드가 메모리 여러 군대에 존재하게 된다. 이는 메모리나 하드 디스크 공간이 그 만큼 낭비된다는 의미이다.
이와 같은 정적 라이브러리 함수의 단점을 극복한 것이 공유 라이브러리이다.
프로그램이 공유 라이브러리를 사용하면 실행 파일에 라이브러리 함수 코드가 포함되는 것이 아니라, 실행 시 사용 가능한 공유코드를 참조하는 방식으로 링크된다. 따라서 이 공유 라이브러리 함수를 이용하는 프로그램이 여러개 일지라도 하나의 라이브러리를 함께 이용하므로, 메모리나 하드디스크를 효과적으로 사용할 수 있다.
리눅스에서 공유 라이브러리를 로드하고 참조 함수를 확인하는 프로그램을 동적 로더(ld.so)라고 한다.
이 로더는 /etc/ld.so.conf 에 설정된 경로를 이용하여 공유 라이브러리를 검색한다.
이 구성 파일에 경로를 추가한 후 ldconfig명령을 이용하면 캐쉬를 업데이트 한다.
※ 출처 : http://babuzzzy.tistory.com/entry/4-리눅스-시스템-프로그래밍-컴파일-라이브러리-생성
'P rogramming > Linux System' 카테고리의 다른 글
정적 라이브러리 생성 (0) | 2011.09.30 |
---|---|
정적 라이브러리의 구조 - ar, ranlib (0) | 2011.09.29 |
라이브러리 함수 목록 (0) | 2011.09.29 |
시스템 콜 목록 (0) | 2011.09.29 |
시스템콜 과 라이브러리 함수 (0) | 2011.09.29 |
RECENT COMMENT