IT개발/Linux & Unix2008. 5. 16. 20:08

공유 라이브러리를 사용하는 이유...
1. 중복되는 라이브러리를 파일 하나로 만들어 실행
2. 라이브러리 코드 영역을 공유하므로 메모리 공간을 절약
3. LGPL 라이선스를 따르는 라이브러리는 공유 라이브러리 형태로 링크가 이뤄져야 라이센스 위반을 피할수 있다. LGPL로 만들어진 코드를 전혀 수정하지 않더라도 정적으로 링크할 경우에는 라이선스 위반이다.


공유 라이브러리 컴파일 방법 ??

[linuxTest]$ gcc -fPIC -c libhello.c
[linuxTest]$ gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0.1 libhello.o -lc

위와 같이 컴파일을 실행하면 libhello.so.1.0.1 파일이 생성된다.

gcc 컴파일 옵션에 대한 설명
-fpic : 작고 빠르지만 경우에 따라서 플랫폼에 따라 제약이 생기는 코드
-fPIC : 크고 느리지만 플랫폼에 무관한 확실한 코드를 생성
-shared : 공유라이브러리 생성
-Wl : 링커에 넘기는 홉션으로 공유라이브러리 이름을 libhello.so.1 로 지정


공유라이브러리를 만들었으면, 이 라이브러리를 이용하여 실행파일을 컴파일 한다.

[linuxTest]$ gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0.1 libhello.o -lc
[linuxTest]$ gcc -o hello hello.c libhello.so.1.0.1 libhello2.so.1.0.1

그러면, hello 라는 실행파일 생기나, error 발생으로 실행되지 않는다.

[linuxTest]$ ./hello
./hello: error while loading shared libraries: libhello.so.1: cannot open shared object file: No such file or directory

문제는 공유 라이브러리를 찾을수 없기 때문이다.
런타임 링커가 공유 라이브러리를 탐색하기 위해 참조하는 환경변수인 LD_LIBRARY_PATH라는 환경변수
가 설정되지 않았기 때문이다. 여기서 링커는 libhello.so.1.0.1 이 아니라 libhello.so.1 를 찾는다. 이유는
공유라이브러리를 생성할때 -soname,libhello.so.1 옵션을 넣었기 때문이다.

이제 LD_LIBRARY_PATH를 설정하고, 링크 옵션을 이용하여 libhello.so.1.0.1 와 libhello.so.1 를 연결시켜보자

[linuxTest]$ export LD_LIBRARY_PATH=`echo $LD_LIBRARY_PATH`:`pwd`
[linuxTest]$ ln -s libhello.so.1.0.1 libhello.so.1
[linuxTest]$ ./hello
Hello, me
Hello, bow(dog)


아래 하나의 문장으로 컴파일 가능하다.
[citylock@localhost linuxTest]$ gcc -o hello.c -L. -lhello


Posted by 시티락