UNIX
어떤 특정한 명세(단일유닉스규격: The Single Unix Specification)를 만족하는 컴퓨터 운영체제. 이 명세는 운영체제의 모든 필수 시스템 함수의 이름, 인터페이스, 행동을 정의한다. 이 명세는 IEEE(Institute of Electrical and Electronic Engineers)가 만든 P1003, 즉 POSIX (Portable Operating System Interface)라는 이전의 일련의 명세들을 대부분 포함한다.


일반적으로 PATH에 걸려 있는 디렉토리
/bin - Binaries, 시스템을 부팅하는데 쓰이는 프로그램들.
/usr/bin - User binaries, 사용자가 실행할 수 있는 표준 프로그램들.
/usr/local/bin - Local binaries, 해당 설치본에 고유한 프로그램들.

관리계정(root)로 로그인 한 경우
/sbin, /usr/sbin - 시스템 관리 프로그램들이 있는 디렉토리들.



정적 라이브러리 - 아카이브(archive)
그냥 목적 파일들을 즉시 사용할 수 있는 형태로 모아둔 것이다. e.x) libc.a, libX11.a
 ar 명령어로 오브젝트 파일을 합쳐서 라이브러리를 생성한다.
ar crv libfoo.a bill.o fred.o

두개의 오브젝트 파일을 libfoo.a(아카이브: 정적 라이브러리) 라이브러리를 생성한다.
오브젝트 파일을 라이브러리로 만들 경우, 오브젝트 파일에도 헤더 파일을 넣는 것이 컴파일 오류를 검출하는데 도움이 된다.

UNIX에서는 ar 명령을 사용한 후 ranlib 명령을 통해 라이브러리의 내용을 담은 표를 만들어야 한다. linux에서는 해도되고 안해도 된다.
ranlib libfoo.a


단점 - 동일한 라이브러리의 함수들을 사용하는 여러 응용프로그램들을 동시에 실행할 경우, 메모리 안에 동일한 함수가 여러개 존재하고, 프로그램 파일에도 수많은 복사본들이 중복해서 존재하게 되어 낭비가 크다.


공유 라이브러리 ( .so )
정적 라이브러리의 단점을 극복하기 위한 라이브러리. 컴파일 할 경우 실제 함수 대신 실행 시점에서 쓰일 공유 코드에 대한 참조 정보를 프로그램에 포함시킨다. 이 방식으로 공유 라이브러리의 복사본 하나를 여러 응용 프로그램에서 동시에 사용할 수 있도록 메모리 안에 배치할 수 있으며, 복사본 하나만 필요하게 되므로 디스크 량도 줄일 수 있다.

공유 라이브러리를 확인할 수 있는 명령어 - ldd
ldd program



gcc
1. 하위 디렉토리나 비표준적인 장소에 있는 헤더 파일을 찾을 때 ( 표준 디렉토리: /usr/include 등... )
gcc -I/usr/openwin/include fred.c


2. 비표준 장소의 라이브러리를 찾을 때 ( 표준 디렉토리: /lib, /usr/lib 등... )
gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11

/usr/openwin/lib 디렉토리에 libX11 라이브러리(libX11.a or libX11.so)를 링크한다.

3. 목적 파일 만들 때 ( -c 옵션 )
gcc -c bill.c fred.c

bill.o, fred.o 생성

4. 실행파일의 경로와 파일명 ( -o 옵션 )
gcc -o program program.o libfoo.a

libfoo.a는 정적 라이브러리.. 위 명령어의 경우 program에 필요한 함수를 가지고 있어서 링크한다.

'학습 정리 > Begginning Linux Programming' 카테고리의 다른 글

Chapter 2. 쉘 프로그래밍 - 1  (0) 2011.09.28
Posted by 뿌리깊은 잡초
,