2012. 10. 9. 15:43

zlib를 static link 빌드하여 linux에서 사용하기

zlib를 static하게 빌드하여 사용하는 방법을 공유합니다.
대략의 skeleton이니, 좀더 확인해 보시기 바랍니다.

#include <stdio.h>
#include "zlib.h"

int main(void)
{
	printf("hello, world!!!\r\n");
	gzopen("/tmp/a.zlib", "w");
	gzread(NULL, NULL, 0);
}

와 같이 zlib를 사용하는 코드를 가정해 봅시다. 물론, 코드에 포함된 의미는 없습니다.
단지, gzopen이나 gzread와 같은 함수 사용에 대한 빌드가 이뤄지는지에 대한 확인이니깐요.
일단, 위 파일을 ~/zlib/test.cpp로 저장합니다.

우선, zlib의 source를 다운로드하고, ~/zlib/zlib-1.2.7에 압축을 풉니다. (작성일 기준으로 1.2.7 버전입니다.)
~/zlib/zlib-1.2.7/zlib.h이 존재하면 됩니다.

이제 다음과 같이 zlib를 컴파일 하고 test.cpp를 빌드합니다.

~$ cd ~/zlib/zlib-1.2.7/
~/zlib/zlib-1.2.7$ ./configure -s
Checking for gcc...
Checking for shared library support...
Building shared library libz.so.1.2.7 with gcc.
Checking for off64_t... Yes.
Checking for fseeko... Yes.
Checking for strerror... Yes.
Checking for unistd.h... Yes.
Checking for stdarg.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.
Checking for attribute(visibility) support... Yes.
Looking for a four-byte integer type... Found.
~/zlib/zlib-1.2.7$ make
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -c -o example.o test/example.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o adler32.o adler32.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o crc32.o crc32.c
...
~/zlib/zlib-1.2.7$ cp *.o ~/zlib
~/zlib/zlib-1.2.7$
cd ..
~/zlib$
gcc -I"~/zlib/zlib-1.2.7" test.cpp adler32.o gzread.o inflate.o trees.o compress.o gzwrite.o inftrees.o uncompr.o crc32.o gzclose.o infback.o zutil.o deflate.o gzlib.o inffast.o
~/zlib$ ./a.out hello, world!!! ~/zlib$
즉, zlib의 ./configure -s를 통해 makefile을 생성합니다. 그다음 make하여 .o와 같은 library를 생성합니다. 그리고 gcc를 통해 빌드된 .o를 link합니다. gcc에 들어같 .o는 다음과 같습니다.

gcc ... adler32.o gzread.o inflate.o trees.o compress.o gzwrite.o inftrees.o uncompr.o crc32.o gzclose.o infback.o zutil.o deflate.o gzlib.o inffast.o

불필요한 .o는 삭제해도 무방합니다. 그리고 example*.o와 minigzip*.o는 link하지 않도록 합니다.
위 나열된 .o들과 -I"..."는 사용하시는 Makefile에 추가하여 사용하시면 됩니다.
물론, 위 코드는 test.cpp 위치에 *.o를 복사하여 사용하는데, /zlib1.2.7.object 경로에 위 *.o를 복사하고, 상대경로로 *.o를 지정(예, ./zlib1.2.7.object/adler32.o)하면 좀더 유연할 듯 합니다.