C++ Builder CE zlib

zlibをソースコードからmakeして使えるようにする

からソースコードをゲット。解凍して、通常はcmakeを使いますが、Makefile.borが見えたので、これを使います。冒頭部分は、

# Makefile for zlib
# Borland C++ for Win32
#
# Usage:
#  make -f win32/Makefile.bor

# ------------ Borland C++ ------------

# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or
# added to the declaration of LOC here:

となっているので、いつものようにOpen Git Bash hereを起動。

ここね。

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1
$ make -f win32/Makefile.bor
MAKE Version 5.43  Copyright (c) 1987, 2019 Embarcadero Technologies, Inc.
        bcc32 -c -a -d -k- -O2  adler32.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
adler32.c:
警告 W8056 zutil.h 47: 整数の算術オーバーフロー
警告 W8056 zutil.h 49: 整数の算術オーバーフロー
        bcc32 -c -a -d -k- -O2  compress.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
compress.c:
        bcc32 -c -a -d -k- -O2  crc32.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
crc32.c:
警告 W8056 zutil.h 47: 整数の算術オーバーフロー
警告 W8056 zutil.h 49: 整数の算術オーバーフロー
 <中略>
Embarcadero C++ 7.70 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
test/minigzip.c:
        bcc32  minigzip.obj zlib.lib
Embarcadero C++ 7.70 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
Turbo Incremental Link 6.99 Copyright (c) 1997-2024 Embarcadero Technologies, Inc.

警告が多すぎるので、カット。一応ライブラリはできて、サンプルプログラムもできているようですが、気持ち悪いのでbcc32ではなくbcc32c(Clang baseのコンパイラ)を使いましょうかね。makefile.borを以下のように修正、

CC = bcc32c
AS = bcc32c
LD = bcc32c
AR = tlib
CFLAGS  = -a -d -O2 $(LOC)

bcc32をbcc32cへ、CFLAGSからオプション“-k-“を取ってみる。

$ make -f win32/makefile.bor
MAKE Version 5.43  Copyright (c) 1987, 2019 Embarcadero Technologies, Inc.
        bcc32c -c -a -d -O2  adler32.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
adler32.c:
        bcc32c -c -a -d -O2  compress.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
compress.c:
        bcc32c -c -a -d -O2  crc32.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
crc32.c:
        bcc32c -c -a -d -O2  deflate.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
deflate.c:
        bcc32c -c -a -d -O2  gzclose.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
gzclose.c:
        bcc32c -c -a -d -O2  gzlib.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
gzlib.c:
        bcc32c -c -a -d -O2  gzread.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
gzread.c:
        bcc32c -c -a -d -O2  gzwrite.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
gzwrite.c:
        bcc32c -c -a -d -O2  infback.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
infback.c:
        bcc32c -c -a -d -O2  inffast.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
inffast.c:
        bcc32c -c -a -d -O2  inflate.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
inflate.c:
        bcc32c -c -a -d -O2  inftrees.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
inftrees.c:
        bcc32c -c -a -d -O2  trees.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
trees.c:
        bcc32c -c -a -d -O2  uncompr.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
uncompr.c:
        bcc32c -c -a -d -O2  zutil.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
zutil.c:
        del zlib.lib
C:\Users\jakeb\Downloads\zlib-1.3.1\zlib-1.3.1\zlib.lib が見つかりませんでした。
        tlib zlib.lib +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj
TLIB 7.1 Copyright (c) 1987-2019 Embarcadero Technologies, Inc.
        tlib zlib.lib +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
TLIB 7.1 Copyright (c) 1987-2019 Embarcadero Technologies, Inc.
        tlib zlib.lib
TLIB 7.1 Copyright (c) 1987-2019 Embarcadero Technologies, Inc.
        bcc32c -c -a -d -O2  test/example.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
test/example.c:
        bcc32c  example.obj zlib.lib
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
bcc32c.exe: warning: argument unused during compilation: '-nobuiltininc' [-Wunused-command-line-argument]
Turbo Incremental Link 6.99 Copyright (c) 1997-2024 Embarcadero Technologies, Inc.
        bcc32c -c -a -d -O2  test/minigzip.c
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
test/minigzip.c:
        bcc32c  minigzip.obj zlib.lib
Embarcadero C++ 7.70 for Win32 Copyright (c) 2012-2024 Embarcadero Technologies, Inc.
bcc32c.exe: warning: argument unused during compilation: '-nobuiltininc' [-Wunused-command-line-argument]
Turbo Incremental Link 6.99 Copyright (c) 1997-2024 Embarcadero Technologies, Inc.

かなりましになりました。ちなみにディレクトtest以下のminigzip.cとかのzlib.hのincludeディレクトリを../zlib.hとしています。ファイル名から内容が予想されますが、minigzip.cのソースを覗くと、

/* ===========================================================================
 * Usage:  minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...]
 *   -c : write to standard output
 *   -d : decompress
 *   -f : compress with Z_FILTERED
 *   -h : compress with Z_HUFFMAN_ONLY
 *   -r : compress with Z_RLE
 *   -1 to -9 : compression level
 */

とあります。動かして見ましょうかね?

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1
$ ./minigzip -f minigzip.exe

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1
$ ls -alt minigzip*
-rw-r--r-- 1 jakeb 197609  85467 12月  7 15:31 minigzip.exe.gz
-rw-r--r-- 1 jakeb 197609 196608 12月  7 15:17 minigzip.tds
-rwxr-xr-x 1 jakeb 197609 149504 12月  7 15:17 minigzip.exe*
-rw-r--r-- 1 jakeb 197609   5416 12月  7 15:17 minigzip.obj

decompressしてみます。

$ ./minigzip -c -d minigzip.exe.gz > restroed.exe

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1
$ ls -alt
total 2480
-rwxr-xr-x 1 jakeb 197609 149504 12月  7 15:35 restroed.exe*
drwxr-xr-x 1 jakeb 197609      0 12月  7 15:35 ./
-rwxr-xr-x 1 jakeb 197609 149504 12月  7 15:34 minigzip.exe.orig*
-rw-r--r-- 1 jakeb 197609  85467 12月  7 15:31 minigzip.exe.gz
-rw-r--r-- 1 jakeb 197609 196608 12月  7 15:17 minigzip.tds
-rwxr-xr-x 1 jakeb 197609 149504 12月  7 15:17 minigzip.exe*
jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1
$ ls -alt *.exe
-rwxr-xr-x 1 jakeb 197609 149504 12月  7 15:35 restroed.exe*
-rwxr-xr-x 1 jakeb 197609 149504 12月  7 15:17 minigzip.exe*
-rwxr-xr-x 1 jakeb 197609 150528 12月  7 15:17 example.exe*

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1
$ cmp minigzip.exe restored.exe
cmp: restored.exe: No such file or directory

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1
$ cmp minigzip.exe restroed.exe

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1

ファイル名間違い restored.exeのつもりでrestroed.exeと打っていたというお粗末。ま、ファイル比較の結果元に戻ってますね。さて、example.cの方は、

/* ===========================================================================
 * Usage:  example [output.gz  [input.gz]]
 */

となっているね。

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1
$ ./example
zlib version 1.3.1 = 0x1310, compile flags = 0x55
uncompress(): hello, hello!
gzread(): hello, hello!
gzgets() after gzseek:  hello!
inflate(): hello, hello!
large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!

jakeb@Orbit-11 MINGW64 ~/Downloads/zlib-1.3.1/zlib-1.3.1

セルフチェックおけですかね?さて、RadstudioにはもともとライブラリがあるようですがZlibの1.3.1がどうしても使いたい場合、関数のI/Fを統一したい場合等は今回のアプローチが吉です。

64bit版を作りたい?上記makefile.borをmakefile.bor64としてコピーしてから、

# Makefile for zlib
# Borland C++ for Win32
#
# Usage:
#  make -f win32/Makefile.bor64

# ------------ Borland C++ ------------

# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or
# added to the declaration of LOC here:
LOC = $(LOCAL_ZLIB)

CC = bcc64
AS = bcc64
LD = bcc64
AR = tlib64
CFLAGS  = -a -d -O2 $(LOC)
ASFLAGS = $(LOC)
LDFLAGS = $(LOC)


# variables
ZLIB_LIB = zlib.a

OBJ1 = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o
OBJ2 = gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o
#OBJA =
OBJP1 = +adler32.o+compress.o+crc32.o+deflate.o+gzclose.o+gzlib.o+gzread.o
OBJP2 = +gzwrite.o+infback.o+inffast.o+inflate.o+inftrees.o+trees.o+uncompr.o+zutil.o
#OBJPA=


# targets
all: $(ZLIB_LIB) example.exe minigzip.exe

.c.o:
	$(CC) -c $(CFLAGS) $<

.asm.o:
	$(AS) -c $(ASFLAGS) $<
以下略

等とすれば作れます。bcc64では*.cのオブジェクトは、*.oとなりますので、viエディター等でglobalな文字列置換するのが吉です。コマンドが分からないって?viでmakefile.bor64を開いてから、”:”を打って、

%s/.obj/.o/g

でおけです。Git Bashでvi使えるの知らなかったので?他の手段でもできるはずです。sedでもawkでも可能かな。

コメント