Shared Library
Windows에서 .dll(동적라이브러리) 파일과 비슷하게, gcc/g++에서는 컴파일 할때 공유 라이브러리를 사용할 수 있다.
공유 라이브러리를 만들고 사용하는 방법은 다음과 같다.
- 공유 라이브러리로 만들 코드는 -fPIC 옵션을 사용해서 목적파일까지만 생성하고, 해당 목적파일과 -shared 옵션을 이용하여 so파일을 생성한다. 이때 생성할 파일의 이름은 lib라는 접두어가 붙는다.
- 생성된 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를 찾게된다.
답글 남기기