スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

libpng.dllを mingw on cygwin で生成

PNGを扱うのにlibpngを使ってみたくなりました。せっかくなので、libpng.dll をソースコードからコンパイルして作成してみることにしました。

libpng はその処理の大半を zlib に任せているので、先ずは zlib.dll を作成する必要があります。zlibのソースコードは本家からDLしてきます。現時点の最新は zlib-1.2.8.tar.gz でした。

解凍するとwin32ディレクトリに Makefile が複数準備されています。cygwin上のmingw(i686-w64-mingw32/x86_64-w64-mingw32)でコンパイルするには少し手を加える必要があります。ここではgcc用のMakefile(Makefile.gcc)を編集します。それと、cygwin32上のmingwでは libgcc を自動で入れてくれていた(気がする)のにcygwin64上のmingwでは自動で静的リンクしてくれないので、リンカオプションに -static-libgcc を付加しています。

$ diff -U3 ./win32/Makefile.gcc.org ./win32/Makefile.gcc
--- ./win32/Makefile.gcc.org 2012-05-03 12:17:59.000000000 +0900
+++ ./win32/Makefile.gcc 2013-08-24 04:52:21.248224600 +0900
@@ -30,7 +30,7 @@
# the DLL name should be changed from "zlib1.dll".

STATICLIB = libz.a
-SHAREDLIB = zlib1.dll
+SHAREDLIB = zlib.dll
IMPLIB = libz.dll.a

#
@@ -41,7 +41,7 @@
#LOC = -DASMV
#LOC = -DDEBUG -g

-PREFIX =
+PREFIX = i686-w64-mingw32-
CC = $(PREFIX)gcc
CFLAGS = $(LOC) -O3 -Wall

@@ -49,7 +49,7 @@
ASFLAGS = $(LOC) -Wall

LD = $(CC)
-LDFLAGS = $(LOC)
+LDFLAGS = $(LOC) -static-libgcc

AR = $(PREFIX)ar
ARFLAGS = rcs

Makefile.gcc を編集し終えたらDLLの生成です。

$ make -fwin32/Makefile.gcc

$ i686-w64-mingw32-objdump.exe -p ./zlib.dll | grep dll
./zlib.dll: file format pei-i386
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
2141a 56 __dllonexit
Name 00020334 zlib.dll

余分なDLLをリンクしてはいないようです。
カレントディレクトリにあるファイルをmingwフォルダへコピーします。

$ cp ./zlib.dll ./usr/i686-w64-mingw32/sys-root/mingw/bin
$ cp ./libz.a ./usr/i686-w64-mingw32/sys-root/mingw/lib
$ cp ./libz.dll.a ./usr/i686-w64-mingw32/sys-root/mingw/lib
$ cp ./zlib.h ./usr/i686-w64-mingw32/sys-root/mingw/include
$ cp ./zconf.h ./usr/i686-w64-mingw32/sys-root/mingw/include

これで zlib.dll 側は完了です。

次はメインの libpng.dll の生成です。
このソースコードも本家からDLしてきます。現時点の最新は libpng-1.6.3.tar.gz でした。

libpng.dll のMakefileは解凍した先のscriptsディレクトリの中にあります。結構いろいろと用意されていますが、cygwin上のmingwでコンパイルするという特殊な物は無いです。なので、一番近そうな msys/mingw 用のMakefileを編集して生成することにしました。

こちらも -static-libgcc オプションを付加するのは変わりませんが、それ以前にDLLが正常に生成されません。おそらく msys/mingw 環境下でも生成されないのではないかという不具合を見つけましたので、その部分も修正しました。また、テスト用のプログラムが静的リンク用だったので、動的リンク用にしてみました。

$ diff -U3 ./scripts/makefile.msys.org ./scripts/makefile.msys
--- ./scripts/makefile.msys.org 2013-07-18 09:03:01.000000000 +0900
+++ ./scripts/makefile.msys 2013-08-24 06:04:58.850866800 +0900
@@ -12,11 +12,11 @@
# For conditions of distribution and use, see the disclaimer
# and license in png.h
# # # # # # # # # # # # # # # # #
-prefix=/usr/local
+prefix=/usr/i686-w64-mingw32/sys-root/mingw
exec_prefix=$(prefix)

# Library name:
-LIBNAME = libpng16
+LIBNAME = libpng
PNGMAJ = 16
RELEASE = 3

@@ -29,14 +29,15 @@
# Where the zlib library and include files are located.
#ZLIBLIB=../zlib
#ZLIBINC=../zlib
-ZLIBLIB=/usr/local/lib
-ZLIBINC=/usr/local/include
+ZLIBLIB=$(prefix)/lib
+ZLIBINC=$(prefix)/include

# Compiler, linker, lib and other tools
-CC = gcc
+CC = i686-w64-mingw32-gcc
LD = $(CC)
-AR_RC = ar rcs
-RANLIB = ranlib
+AR_RC = i686-w64-mingw32-ar rcs
+RANLIB = i686-w64-mingw32-ranlib
+STRIP = i686-w64-mingw32-strip
RM_F = rm -rf
MKDIR_P=mkdir -p
LN_SF=ln -sf
@@ -52,7 +53,7 @@
CFLAGS = -W -Wall $(CRELEASE) $(ARCH)
#LDFLAGS = $(LDDEBUG)
LDFLAGS = $(LDRELEASE)
-LIBS = -lz -lm
+LIBS = -lz -lm -static-libgcc

# File extensions
O=.o
@@ -97,8 +98,9 @@

static: libpng$(A) pngtest$(EXE)

-shared: $(LIBSOMAJ)
- $(CC) -shared -Wl,-soname,$(LIBSOMAJ) -o $(LIBSO)
+shared: $(OBJS)
+ $(CC) -shared -Wl,--out-implib,$(LIBSO)$(A) -o $(LIBSO) $(OBJS) -L$(ZLIBLIB) $(LIBS)
+ $(STRIP) $(LIBSO)

$(LIBSO): $(LIBSOMAJ)
$(LN_SF) $(LIBSOMAJ) $(LIBSO)
@@ -178,12 +180,12 @@
test: pngtest$(EXE)
./pngtest$(EXE)

-pngtest$(EXE): pngtest$(O) libpng$(A)
- $(LD) $(LDFLAGS) -L$(ZLIBLIB) -o $@ pngtest$(O) libpng$(A) $(LIBS)
+pngtest$(EXE): pngtest$(O) libpng$(A) shared
+ $(LD) $(LDFLAGS) -L$(ZLIBLIB) -o $@ pngtest$(O) $(LIBSO)$(A) $(LIBS)

clean:
$(RM_F) *$(O) libpng$(A) pngtest$(EXE) pngout.png pnglibconf.h $(LIBSO) \
- $(LIBSOMAJ) libpng-config
+ $(LIBSO)$(A) $(LIBSOMAJ) libpng-config

png$(O): png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h
pngerror$(O): png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h

先頭のディレクトリで make を実行します。
$ make -fscripts/makefile.msys

$ i686-w64-mingw32-objdump.exe -p ./libpng.dll | grep dll
./libpng.dll: file format pei-i386
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
334c4 56 __dllonexit
DLL Name: zlib.dll
Name 00031054 libpng.dll
$ i686-w64-mingw32-objdump.exe -p ./pngtest.exe | grep dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
e6f8 56 __dllonexit
DLL Name: libpng.dll

pngtest.exe は libpng.dll を使います。また、libpng.dll は zlib.dll を使いますので、pngtest.exe 実行の前に zlib.dll をパスの通った所に置いておきます。とりあえずテスト段階なので、pngtest.exeと同列のディレクトリにコピっておきました。

$ ./pngtest.exe

Testing libpng version 1.6.3
with zlib version 1.2.8

libpng version 1.6.3 - July 18, 2013
Copyright (c) 1998-2013 Glenn Randers-Pehrson
Copyright (c) 1996-1997 Andreas Dilger
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
library (10603): libpng version 1.6.3 - July 18, 2013

pngtest (10603): libpng version 1.6.3 - July 18, 2013

Testing pngtest.png:
Pass 0: rwrwrwrwrwrwrwrwrw
Pass 1: rwrwrwrwrwrwrwrwrw
Pass 2: rwrwrwrwrwrwrwrw
Pass 3: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
Pass 4: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
Pass 5: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
rwrwrwrw
Pass 6: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
rwrwrwrwrw
PASS (9782 zero samples)
Filter 0 was used 21 times
Filter 1 was used 15 times
Filter 2 was used 52 times
Filter 3 was used 10 times
Filter 4 was used 33 times
tIME = 7 Jun 1996 17:58:08 +0000
libpng passes test

テストも無事に実行できたので必要なファイルを適所にコピーします。
$ cp ./libpng.dll /usr/i686-w64-mingw32/sys-root/mingw/bin
$ cp ./libpng.a /usr/i686-w64-mingw32/sys-root/mingw/lib
$ cp ./libpng.dll.a /usr/i686-w64-mingw32/sys-root/mingw/lib
$ cp ./png.h /usr/i686-w64-mingw32/sys-root/mingw/include
$ cp ./pngconf.h /usr/i686-w64-mingw32/sys-root/mingw/include
$ cp ./pnglibconf.h /usr/i686-w64-mingw32/sys-root/mingw/include

これで32bit版は完了です。
64bit版の生成もほとんど同じ方法です。

[zlib]
$ diff -U3 ./win32/Makefile.gcc.org ./win32/Makefile.gcc
--- ./win32/Makefile.gcc.org 2012-05-03 12:17:59.000000000 +0900
+++ ./win32/Makefile.gcc 2013-08-24 05:29:24.378337400 +0900
@@ -30,7 +30,7 @@
# the DLL name should be changed from "zlib1.dll".

STATICLIB = libz.a
-SHAREDLIB = zlib1.dll
+SHAREDLIB = zlib.dll
IMPLIB = libz.dll.a

#
@@ -41,7 +41,7 @@
#LOC = -DASMV
#LOC = -DDEBUG -g

-PREFIX =
+PREFIX = x86_64-w64-mingw32-
CC = $(PREFIX)gcc
CFLAGS = $(LOC) -O3 -Wall

@@ -49,7 +49,7 @@
ASFLAGS = $(LOC) -Wall

LD = $(CC)
-LDFLAGS = $(LOC)
+LDFLAGS = $(LOC) -static-libgcc

AR = $(PREFIX)ar
ARFLAGS = rcs

$ make -fwin32/Makefile.gcc
$ x86_64-w64-mingw32-objdump.exe -p ./zlib.dll | grep dll
./zlib.dll: file format pei-x86-64
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
2566e 78 __dllonexit
Name 0000000000024334 zlib.dll
$ cp ./zlib.dll ./usr/x86_64-w64-mingw32/sys-root/mingw/bin
$ cp ./libz.a ./usr/x86_64-w64-mingw32/sys-root/mingw/lib
$ cp ./libz.dll.a ./usr/x86_64-w64-mingw32/sys-root/mingw/lib
$ cp ./zlib.h ./usr/x86_64-w64-mingw32/sys-root/mingw/include
$ cp ./zconf.h ./usr/x86_64-w64-mingw32/sys-root/mingw/include


[libpng]
$ diff -U3 ./scripts/makefile.msys.org ./scripts/makefile.msys
--- ./scripts/makefile.msys.org 2013-07-18 09:03:01.000000000 +0900
+++ ./scripts/makefile.msys 2013-08-24 05:53:12.730818200 +0900
@@ -12,11 +12,11 @@
# For conditions of distribution and use, see the disclaimer
# and license in png.h
# # # # # # # # # # # # # # # # #
-prefix=/usr/local
+prefix=/usr/x86_64-w64-mingw32/sys-root/mingw
exec_prefix=$(prefix)

# Library name:
-LIBNAME = libpng16
+LIBNAME = libpng
PNGMAJ = 16
RELEASE = 3

@@ -29,14 +29,15 @@
# Where the zlib library and include files are located.
#ZLIBLIB=../zlib
#ZLIBINC=../zlib
-ZLIBLIB=/usr/local/lib
-ZLIBINC=/usr/local/include
+ZLIBLIB=$(prefix)/lib
+ZLIBINC=$(prefix)/include

# Compiler, linker, lib and other tools
-CC = gcc
+CC = x86_64-w64-mingw32-gcc
LD = $(CC)
-AR_RC = ar rcs
-RANLIB = ranlib
+AR_RC = x86_64-w64-mingw32-ar rcs
+RANLIB = x86_64-w64-mingw32-ranlib
+STRIP = x86_64-w64-mingw32-strip
RM_F = rm -rf
MKDIR_P=mkdir -p
LN_SF=ln -sf
@@ -52,7 +53,7 @@
CFLAGS = -W -Wall $(CRELEASE) $(ARCH)
#LDFLAGS = $(LDDEBUG)
LDFLAGS = $(LDRELEASE)
-LIBS = -lz -lm
+LIBS = -lz -lm -static-libgcc

# File extensions
O=.o
@@ -97,8 +98,9 @@

static: libpng$(A) pngtest$(EXE)

-shared: $(LIBSOMAJ)
- $(CC) -shared -Wl,-soname,$(LIBSOMAJ) -o $(LIBSO)
+shared: $(OBJS)
+ $(CC) -shared -Wl,--out-implib,$(LIBSO)$(A) -o $(LIBSO) $(OBJS) -L$(ZLIBLIB) $(LIBS)
+ $(STRIP) $(LIBSO)

$(LIBSO): $(LIBSOMAJ)
$(LN_SF) $(LIBSOMAJ) $(LIBSO)
@@ -178,12 +180,12 @@
test: pngtest$(EXE)
./pngtest$(EXE)

-pngtest$(EXE): pngtest$(O) libpng$(A)
- $(LD) $(LDFLAGS) -L$(ZLIBLIB) -o $@ pngtest$(O) libpng$(A) $(LIBS)
+pngtest$(EXE): pngtest$(O) libpng$(A) shared
+ $(LD) $(LDFLAGS) -L$(ZLIBLIB) -o $@ pngtest$(O) $(LIBSO)$(A) $(LIBS)

clean:
$(RM_F) *$(O) libpng$(A) pngtest$(EXE) pngout.png pnglibconf.h $(LIBSO) \
- $(LIBSOMAJ) libpng-config
+ $(LIBSO)$(A) $(LIBSOMAJ) libpng-config

png$(O): png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h
pngerror$(O): png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h

$ x86_64-w64-mingw32-objdump.exe -p ./libpng.dll | grep dll
./libpng.dll: file format pei-x86-64
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
3a7a0 78 __dllonexit
DLL Name: zlib.dll
Name 000000000003804a libpng.dll
$ x86_64-w64-mingw32-objdump.exe -p ./pngtest.exe | grep dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
11c0c 78 __dllonexit
DLL Name: libpng.dll
$ ./pngtest.exe

Testing libpng version 1.6.3
with zlib version 1.2.8

libpng version 1.6.3 - July 18, 2013
Copyright (c) 1998-2013 Glenn Randers-Pehrson
Copyright (c) 1996-1997 Andreas Dilger
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
library (10603): libpng version 1.6.3 - July 18, 2013

pngtest (10603): libpng version 1.6.3 - July 18, 2013

Testing pngtest.png:
Pass 0: rwrwrwrwrwrwrwrwrw
Pass 1: rwrwrwrwrwrwrwrwrw
Pass 2: rwrwrwrwrwrwrwrw
Pass 3: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
Pass 4: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
Pass 5: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
rwrwrwrw
Pass 6: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
rwrwrwrwrw
PASS (9782 zero samples)
Filter 0 was used 21 times
Filter 1 was used 15 times
Filter 2 was used 52 times
Filter 3 was used 10 times
Filter 4 was used 33 times
tIME = 7 Jun 1996 17:58:08 +0000
libpng passes test
$ cp ./libpng.dll /usr/x86_64-w64-mingw32/sys-root/mingw/bin
$ cp ./libpng.a /usr/x86_64-w64-mingw32/sys-root/mingw/lib
$ cp ./libpng.dll.a /usr/x86_64-w64-mingw32/sys-root/mingw/lib
$ cp ./png.h /usr/x86_64-w64-mingw32/sys-root/mingw/include
$ cp ./pngconf.h /usr/x86_64-w64-mingw32/sys-root/mingw/include
$ cp ./pnglibconf.h /usr/x86_64-w64-mingw32/sys-root/mingw/include

さて、これでPNG画像をコネコネしましょうかね。
スポンサーサイト

tag : library

tag : mingw

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

RaspberryPi ぺるけ Linux TRminiWatterPart4 トランジスタ式ミニワッター MPD イーサネットコンバータ OpenOCD DAC FON2405E buildroot FM3ペリフェラル BeagleBoneBlack library FM3評価ボード ODROID-U2 mingw OpenGL TL-WR700N Edison bitbake KiCad VMware シングル FM4 ミニワッター 6N6P 計測 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。