[C/C++] Shared Library

Shared Library

Windows에서 .dll(동적라이브러리) 파일과 비슷하게, gcc/g++에서는 컴파일 할때 공유 라이브러리를 사용할 수 있다.

공유 라이브러리를 만들고 사용하는 방법은 다음과 같다.

  1. 공유 라이브러리로 만들 코드는 -fPIC 옵션을 사용해서 목적파일까지만 생성하고, 해당 목적파일과 -shared 옵션을 이용하여 so파일을 생성한다. 이때 생성할 파일의 이름은 lib라는 접두어가 붙는다.
  2. 생성된 so파일을 사용하는 실행파일의 코드는 다음과 같은 옵션을 붙여서 컴파일 한다.
    • -L(so파일의 링킹 시 경로)
    • -Wl,-rpath=(so파일의 실행 시 경로)
    • -l(so파일에서lib접두어와확장자를제외한이름)

Example

[code language=”c” title=”test.c”]
#include<stdio.h>

void libraryTest(){
printf("Hello World!\n");
}
[/code]

[code language=”c” title=”main.c”]
extern void libraryTest();

int main(){
libraryTest();
return 0;
}
[/code]

[code language=”bash” title=”making so file”]
gcc -c -fPIC test.c
gcc test.o -shared -o libtest.so
[/code]

so파일이 ‘어디에’ 생성되는지 확인할 필요가 있다.

[code language=”bash” title=”making executable file”]
gcc -L. -Wl,-rpath=. main.c -o main -ltest
[/code]

위에서 언급했듯이, -L 뒤에는 실행파일이 링킹 될 때에 so 라이브러리 파일의 위치, -rpath는 실행 시에 so 라이브러리 파일의 위치를 나타낸다.
따라서 위의 main을 그냥 실행시키면 실행이 되지만, so파일을 다른 곳으로 이동시키고 다시 실행시키면 실행이 되지 않는다.

-L -Wl,-rpath=
복수지정 불가능 복수 지정 가능. (:로 구별)

파일들은 목적에 맞게 구별해놓는 것이 좋다고 생각하기 때문에, 라이브러리 파일들을 해당 디렉터리의 하위디렉터리인 lib에 넣어 놓는다면, main(executable file)은 다음과 같이 컴파일 하면 좋다.

[code language=”bash”]
gcc -L./lib -Wl,-rpath=.:./lib -o main -ltest
[/code]

이렇게 해놓으면, 링킹시에 ./lib에 있는 libtest.so를 찾아서 링킹을 시키고, 실제로 실행시킬 때에는 .나 ./lib에 있는 libtest.so를 찾게된다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다