2016. 1. 13. 09:29

zlib 1.2.8 C++ 방식으로 편리하게 사용하기

zlib(링크)는 높은 수준의 압축이 지원되는 라이브러리입니다. 다만, 해당 Opensource는 standard c로 구성되어 있어, 사용에는 큰 불편함이 없지만, namespace등의 미사용으로 인해 type등이 섞일 수 있습니다. 즉, 만일, uLong이라는 type을 미리 사용하고 있었다면, zlib를 가져오게 된다면, 충돌이 발생할 수 있습니다(물론, lib로 빌드하면 문제는 없겠지만...). 그래서, zlib의 .c로 구성된 소스를 .cpp로 이름을 변경하고, namespace를 만들어, 이런 문제를 해결하고자 했습니다. 또한, 최근의 Visual Studio에서 컴파일시 몇몇 warning을 제거하여, clean build가 가능하도록 하였습니다. 이는 Linux의 gcc에서도 마찮가지도 지원됩니다.

zlib-1.2.8.modified.zip

사용은 아래와 같습니다. (물론, #include "zlib.h"가 포함)

zlib::gzFile f = NULL;
f = zlib::gzopen("E:\\Temp\\a.gz", "w");
//f = zlib::gzopen("/tmp/a.gz", "w");
zlib::gzwrite(f, "hello, world", 12);
zlib::gzclose(f);

즉, 일반적인 zlib type이나 API에 zlib:: 와 같은 namespace를 사용하면 됩니다. 전역적인 type이나 namespace를 사용하지 않았기 때문에, 아래와 같이 Visual Studio의 global은 비어 있게 됩니다.

혹시나, 기존 코드의 porting등으로, zlib::를 붙이는데 귀찮을수 있다면,

USING_NAMESPACE_ZLIB;
// 혹은
using namespace zlib;

gzFile f = NULL;
f = gzopen("E:\\Temp\\a.gz", "w");
//f = gzopen("/tmp/a.gz", "w");
gzwrite(f, "hello, world", 12);
gzclose(f);

와 같이 USING_NAMESPACE_ZLIB 혹은 using namespace zlib를 상단에 붙여주면 됩니다.

빌드는, zlib-1.2.8.modified.zip의 모든 .cpp를 프로젝트에 넣으면 되며, gcc인 경우, makefile에 추가하면 됩니다. 추가적인 define등은 굳이 필요하진 않습니다.