본문으로 바로가기

[리눅스] 동적, 정적 라이브러리

category 운영체제/리눅스 2021. 3. 29. 18:34
728x90
반응형

오늘은 동적/정적라이브러리의 차이에 대해 알아보겠습니다.

1. 동적 라이브러리

실행 시간에 라이브러리 파일을 찾아 코드를 포함하기 때문에 동적라이브러리라고 부릅니다.

즉, 정적 라이브러리는 컴파일 시간에 코드를 결정하기 때문에 소스가 변경되면 새로 컴파일 해야하지만, 동적 라이브러리의 경우 라이브리만 교체하는 것으로도 변경이 가능합니다.

# gcc -c -fPIC test.c
# gcc -c app.c

 

fPIC옵션은 Position-Independent Code의 약자이며 test.o파일을 동적라이브러리로 사용하도록 컴파일 하는 옵션입니다.

이렇게 컴파일된 오브젝트 파일을 .so파일로 묶으면 됩니다.

 

# gcc -shared -fPIC -o libtest.so test.o

 

컴파일은 아래와 같이 하면 됩니다.

# gcc -o app app.o -L. -ltest

만일, libtest.a 파일과 libtest.so 파일이 같이 있을 경우 gcc 컴파일러는 libtest.so 파일을 먼저 지정하게 된다. 만일 libtest.a를 사용하여 컴파일 하고 싶으면 아래와 같이 실행하면 됩니다.

# gcc -static -o app app.o -L. -ltest

2. 정적 라이브러리(또는 Archive)

정적라이브러리(또는 Archive)파일이라 불리우고 .a의 확장자를 가집니다.

여러개의 오브젝트 파일들을 하나로 묶어 사용하기 때문에 Archive파일이라고 부르며, 컴파일 시간에 코드를 포함하여 결정하기 때문에 정적 라이브러리라고 부릅니다.

파일을 오브젝트 파일로 컴파일 한다.

 

# gcc -c test.c
# gcc -c app.c

test.o 파일과 app.o 파일이 생기는데 test.o 파일을 Archive로 묶어 보겠습니다.

라이브러리 파일의 작명법은 lib뒤에 이름을 붙이는 것이다.

# ar cr libtest.a test.o

libtest.a 파일이 생성되었을 것이며 이 라이브러리를 사용하여 컴파일 할려면 아래와 같이 합니다.

#gcc -o  app app.o -L. -ltest

-L은 라이브러리 파일의 위치를 지정하며 -ltest가 libtest.a를 지정하게 된다. 

이상입니다.

728x90
반응형