개발 시스템의 개요
1. 응용프로그램
- 일반적으로 응용프로그램들은 각자 자신만의 개별적인 디렉터리에 저장되나 시스템이 제공하는 기본 응용프로그램들은 /usr/bin에 들어있다. 구체적인 호스트 컴퓨터나 지역네트워크를 위해 시스템관리자가 추가한 응용프로그램들은 /usr/local/bin이나 /opt에 있는 경우가 많다.
- 관리자들은 /opt나 /usr/local을 선호한다. 그러면 서드파티 제작사가 제공했거나 나중에 추가한 파일들과 시스템이 제공한 파일들을 구분할 수 있기 때문이다. 이렇게 되면 운영체제 업그레이드 할 때 편하다. /opt와 /usr/local만 보존하면 되기 때문이다. 만약 시스템 전역 응용프로그램을 만든다면 /usr/local 에서 프로그램을 설치하는 것이 바람직하다.
- GNU컴파일러 시스템의 구동프로그램인 gcc는 /usr/bin이나 /usr/local/bin에 들어 있다.
2. 헤더파일
- C의 헤더파일들은 거의 /usr/inclujde/와 그하위 디렉터리들에 들어 있고, 특정 리눅스 설치본에 의존적인 헤더 파일들은 보통 /usr/include/sys 와 /usr/include/linujx에 있다. 특정 언어나 프로그래밍 시스템의 경우 해당 컴파일러가 필요한 헤더 파일들을 찾기위해 특정한 디렉토리를 검색하기도한다.
- 하위 디렉토리나 비표준적인 장소에 있는 헤더 파일들을 명시적으로 찾아야 할 때는 -I (I는 include를 의미)를 사용하면 된다.
gcc -I /usr/openwin/include fred.c
=> fred.c파일을 컴파일 할때 /usr/openwin/include 디렉토리를 들여다본다.
3. 라이브러리 파일
- 라이브러리(library)는 재사용을 염두에 두고 작성한 함수들을 미리 컴파일한 결과를 모아둔 것이다. 일반적으로 공통의 과제를 수행하기 위한 연관된 함수들로 구성된다.
- 일반적으로, 표준 시스템 라이브러리들은 /lib와 /usr/lib에 들어 있다. C 컴파일러(좀더 정확히 말하자면 링커(linker))는 기본적으로 표준 C라이브러리만 검색한다. 그 외의 라이브러리를 사용하는 경우에는 라이브러리의 위치와 이름을 링커에게 알려주어야한다.
- 라이브러리 파일은 항상 lib로 시작한다. 그 다음에는 그것이 어떤 라이브러리인지를 알려주는 이름이 붙는다(C 라이브러리의 경우 c, 수학 라이브러리의 경우 m). 마지막으로는 라이브러리 종류를 의미하는 확장자가 붙는다.
정적 라이브러리는 .a
공유 라이브러리는 .so
로 확장자가 붙는다.
- 라이브러리 파일을 지정할 때에는 전체경로 이름을 지정할 수도 있고 헤더파일을 명시적으로 표시해주는 -I 플래그를 이용 할 수도 있다.
gcc -o fred fred.c /usr/lib/libm.a
이것은 fred.c를 컴파일해서 fred라는 실행 파일을 만들되 표준 C라이브러리 뿐만 아니라 /usr/lib/libm.a에 있는 수학 함수들도 사용하나는 뜻이다.
gcc -o fred fred.c -Im
이것은 -I 플래그를 이용한 것이다. -I과 m을 붙여서 수학 라이브러리를 사용 할 수 있도록 한것 libm.a를 m으로 줄여서 표시한 것으로 libm.a파일은 /usr/lib에 있어야 한다. 헤더파일 처럼 흔히 쓰이는 라이브러리들도 표준 장소에 존재한다.
- 표준 장소들에 존재하지 않는 라이브러리인 경우에는 -L옵션을 이용해서 라이브러리 검색경로를 지정한다.
gcc -o x11fred -L/usr/openwin/lib x11fred.c -lx11
이것은 /usr/opnwin/lib디렉터리에 있는 libx11라이브러리를 이용해서 x11fred라는 프로그램을 컴파일, 링크한다.
4. 정적 라이브러리
- 가장 간단한 형태로 그냥 목적파일(object file)들을 즉시 사용할 수 있는 평태로 모아둔 것이다. 라이브러리에 저장되어 있는 함수를 사용하는 프로그램을 만들 때면 개발자는 소스코드에서 해당 함수를 선언하는 헤더 파일을 포함 시키게 된다. 프로그램의 코드와 라이브러리의 코드를 하나의 실행 가능한 프로그램으로 결합하는 일은 컴파일러와 링커가 처리한다.
- 만일 프로그램이 표준 C실행 시점 라이브러리 이외의 라이브러리를 사용한다면 해당 라이브러리를 -I 옵션으로 지정해 주어야 한다.
- 정적 라이브러리를 아카이브(archive)라고도 한다.
- 정적 라이브러리의 확장자는 .a
- 자신만의 정적 라이브러리를 만들고 관리할 수 있다. 함수들을 gcc로 컴파일 해서 얻은 목적 파일들을 ar 프로그램으로 합치면 된다. 라이브러리를 만들 때에는 함수들을 최대한 개별적인 소스 파일들로 분리하는 것이 좋다. 만일 함수들이 공통의 자료에 접근해야 한다면 그 자료를 함수와 동일한 소스파일에 넣고 그 파일 안에서 선언된 정적 변수들을 사용하면 된다.
5. 공유 라이브러리
- 동일한 라이브러리의 함수들을 사용하는 여러 응용프로그램들을 동시에 싱행하는 경우 메모리에 동일한 함수의 복사본이 여러 개 존재하여 메모리와 디스크 공간이 낭비 된다! => 정적 라이브러리의 단점!!
- Unix와 리눅스에서 정적 라이브러리의 단점을 극복하기 위하여 등장한 것이 공유라이브러리!
- 공유라이브러리는 정적 라이브러리들과 같은 장소에 저장되지만, 파일 확장자가 .so로 .a를 가지는 정적라이브러리와 다르다. 예를 들어 표준 수학 라이브러리의 공유 버전은 /lib/libm.so이다.
- 프로그램이 공유라이브러리를 사용하는 경우 컴파일러는 함수 코드 자체 대신 실행 시점에서 쓰일 공유 코드에 대한 참조 정보를프로그램에 포함시킨다. 프로그램 실행을 위해 메모리에 프로그램을 적제하는 과정에서 시스템은 함수 참조들을 분석해 공유라이브러리의 해당 코드에 연결 시킨다. 아직 메모리에 사용할 공유 라이브러리가 적제되어 있지 않다면 적재시킨다.
- 공유 라이브러리를 사용 하는 프로그램들과는 무관하게 공유 라이브러리를 갱신 할 수 있다. 예를 들어 수학 라이브러리가 새롭게 갱신된다면 /lib/libm.so 파일이 /lib/libm.so.N(여기서 N은 버전번호) 이 존재하게 되어 오래된 프로그램이 오작동 하는 일이 없도록 한다. 리눅스는 응용프로그램을 시작할때 해당 프로그램이 요구하는 버전을 고려해 공유 라이브러리를 처리한다.
- 공유라이브러리는 windows에서 동적 링크 라이브러리와 비슷하다. .so라이브러리는 .DLL 파일에 해당한다. 둘 다 실행 시점에서 요구된다. .a라이브러리는 .LIB와 유사하고 둘다 프로그램 실행 파일 자체에 포함된다.
※ UNIX(LINUX)와 WINDOWS 비교
|
UNIX |
Windows |
프로그램 | program(확장자 무관. 없어도 됨) | PROGRAM.EXE |
목적 모듈(목적파일) |
func.o |
FUNC.OBJ |
정적 라이브러리 |
lib.a |
LIB.LIB |
동적 라이브러리 |
lib.so |
LIB.DLL |
'개발 > Linux' 카테고리의 다른 글
파일 다루기 - 리눅스 파일 구조 (0) | 2014.10.10 |
---|---|
실습 2 : 정적 라이브러리 (0) | 2014.10.09 |
실습 1 : Hello World (0) | 2014.10.09 |
리눅스 프로그래밍 (0) | 2014.10.09 |
리눅스(Linux)란? (0) | 2014.10.09 |