GNU Libtool 사용해서 shared object library 만들어보기
과거에는 개발자가 shared libraries를 사용하기 위해서는자신이 개발하는 package가 지원해야 하는 모든 플랫폼에 대해서 각 플랫폼에만 국한되는 일은 모두따로따로 작업을 해야만 했다고 한다. 또, configurationinterface를 따로 설계하여 package installer가 어떤 library들을 설치해야 하는지 선택할 수 있도록 해야만 했다고 한다.GNU Libtool 은 platform-specific dependencies 및 user interface에 대한 정보를 하나의 스크립트에 설정할 수 있게 함에 따라 개발자가 예전에 짊어져야했던 많은 짐을 덜어준다. (GNU Libtool manual 서문의 첫 세 문장을 번역한 것이다. 원문을 보는 것이 아마 더 이해가 빠를 것이다. - click "more" to read it)
* 본문의 내용에 대해서 잘 아시는 분은 틀린부분에 대해서 바로잡아주시고, 명확하지 않은 부분에 대해서는 어떤 보충설명을 하면 좋을지 의견을 남겨주시기 바랍니다.
* 해보시면서 의문이 드는 점도 물어봐주시면 아는대로 성심성의껏 답변해 보도록 하겠습니다.
* 빨간 글씨로 된 부분은 잘 모르겠거나 이해가 안 가는 부분이므로, 이 부분에 대해서 설명해 주실분은 댓글로 친절하게 설명해 주시면 정말 쌩큐베리 감솨 드리겠습니다...- /home/dansoonie/Work/fyitest에서 위에서 build libfyi를 가져다 쓴다
- libfyi를 /usr/lib에 설치한다.
- /home/dansoonie/Work/fyitest에서 /usr/lib에 설치된 libfyi를 가져다 쓴다.
libtool version: 1.5.26-lubuntul (1.1220.2.493 2008/02/01 16:58:18)
간단하게 함수 두 개를 가지고 있는 라이브러리를 작성해보자.
/home/dansoonie/Work/fyi/fyi.h listing
#define FYI_H
void name();
void birthday();
#endif
/home/dansoonie/Work/fyi/fyi.c listing
#include "fyi.h"
void name()
{
printf("Yoon-Soo Lee\");
}
void birthday()
{
printf("Januaary 18th\n");
}
2. Object File 생성하기
설명:
libtool :
libtool 실행 커맨드
--mode=compile :
mode는 컴파일하기
gcc -g -O -c fyi.c :
gcc 실행문. gcc 옵션은 -c(링크하지 않기)만 꼭 있어야 하고 나머지는 없어도 되는것 같다.
/home/dansoonie/Work/fyi/
/home/dansoonie/Work/fyi/
/home/dansoonie/Work/fyi/
설명:
libtool :
libtool 실행 커맨드
--mode=link :
mode는 링크하기
- gcc -g -O -o libfyi.la fyi.lo -rpath /usr/lib :
gcc 실행문. libfyi.la는 libtool control file name으로 확장자가 .a인 standard library name과는 다르다. 어쨌든, 출력을 왜 확장자가 .la인 파일로 정해야 하는지는 잘 모르겠다. fyi.lo는 fyi.la를 출력하기 위해 필요한 파일이고, -rpath 옵션을 통해서 library가 최종적으로 설치(복사)될 경로를 지정해 준다.
질문... /usr/lib, 즉 궁극적으로 설치될 경로를 지정해 주는 이유는 무엇인가? 나중에 libtool을 사용해서 library를 install할때 또 libtool에 argument로 그 경로를 넘겨주는것 같은데 말이다...
/home/dansoonie/Work/fyi/
/home/dansoonie/Work/fyi/.libs/libfyi.la -> ../libfyi.la
/home/dansoonie/Work/fyi/.libs/libfyi.lai
/home/dansoonie/Work/fyi/.libs/libfyi.so -> libfyi.so.0.0.0
/home/dansoonie/Work/fyi/.libs/libfyi.so.0 -> libfyi.so.0.0.0
/home/dansoonie/Work/fyi/.libs/libfyi.so.0.0.0
4. Library를 executable에 link해서 사용하기
일단 libfyi를 가져다쓸 executable을 테스트로 만들어보자.
/home/dansoonie/Work/fyitest/fyitest.c listing
#include "fyi.h"
int main()
{
birthday();
return0;
설명:
- -I../fyi :
/home/dansoonie/Work/fyi 디렉터리를 include path에 추가하여 fyi.h가 include될 수 있도록 한다.
- -g :
debug 정보 포함되도록 컴파일하는 옵션
- -O :
optimization 하는 옵션
- -c :
링크는 하지 않는 옵션
/home/dansoonie/Work/fyitest/
output
gcc -g -O -o .libs/fyitest fyitest.o ../fyi/.libs/libfyiso creating fyitest
생성물
/home/dansoonie/Work/fyitest/
/home/dansoonie/Work/fyitest/
/home/dansoonie/Work/fyitest/
생성물 실행시 output 결과
Yoon-Soo Lee January 18th
5. Library를 Install하기
설명
su 권한 상태에서 명령어를 실행하던지, 저 명령어 앞에 sudo를 사용하여 그 명령어만 su권한으로 실행하도록 한다. 당연히 su 비밀번호는 알아야 한다.
(cd /usr/lib && { ln -s -f libfyi.so.0.0.0 libfyi.so.0 || { rm -f libfyi.so.0 && ln -s libfyi.so.0.0.0 libfyi.so.0; }; })
(cd /usr/lib && { ln -s -f libfyi.so.0.0.0 libfyi.so || { rm -f libfyi.so && ln -s libfyi.so.0.0.0 libfyi.so; }; })
install -c .libs/libfyi.lai /usr/lib/libfyi.la
install -c .libs/libfyi.a /usr/lib/libfyi.a
chmod 644 /usr/lib/libfyi.a
ranlib /usr/lib/libfyi.a
PATH="$PATH:/sbin" ldconfig -n /usr/lib
-----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
설명
su 권한 상태에서 명령어를 실행하던지, 저 명령어 앞에 sudo를 사용하여 그 명령어만 su권한으로 실행하도록 한다. 당연히 su 비밀번호는 알아야 한다.
6. Install된 Library를 executable에 link해서 사용하기
이전에 만들었던 /home/dansoonie/Work/fyitest/fyitest.c 을 사용하자
설명:
- -g :
debug 정보 포함되도록 컴파일하는 옵션
- -O :
optimization 하는 옵션
- -c :
링크는 하지 않는 옵션
/home/dansoonie/Work/fyitest/
생성물
/home/dansoonie/Work/fyitest/
최종 생성물 실행시 output 결과
Yoon-Soo Lee January 18th
질문... -rpath를 /usr/local/lib으로 하면 6번과정을 마치고 ldd fyitest를 하여 fyitest가 어떤 library를 link했는지 살펴보면 libfyi.so.0 => not found 라고 나온다.
'Information > Programming' 카테고리의 다른 글
Basics of Compilers... (5) | 2009.02.12 |
---|---|
Building curl 17.19.3 with OpenSSL and zlib on MSVC (2) | 2009.02.03 |
Building openSSL 0.9.8j on Windows (2) | 2009.02.02 |
Working with WebCore in Webkit... (4) | 2009.01.13 |
Making your code more portable by avoiding inlining??? (6) | 2008.11.23 |
[S/E] Term confusion - Association and Object Association (4) | 2008.03.23 |
[VC++] Need a more accurate timer? (0) | 2008.03.18 |
[S/E] How is Aggregation and Composition different? (11) | 2008.03.17 |
[Algorithm] 변수 없이 Swap하기, but not an option? (11) | 2008.02.26 |
[VC++] Window의 초기 크기와 위치 정해주기 (1) | 2008.02.24 |