2015年9月28日月曜日

mingw-gcc (C言語) でスタティックリンクをしたい

例えば、libpng をスタティックリンクしたいんで。

$ gcc a.c
C:\msys32\tmp\ccUYzSGl.o:a.c:(.text+0x2a): undefined reference to `png_init_io'
collect2.exe: error: ld returned 1 exit status

-lpng が必要。

$ gcc a.c -lpng

ビルドは通りました。

$ od a.exe
        DLL Name: KERNEL32.dll
        DLL Name: msvcrt.dll
        DLL Name: libpng16-16.dll


od は、bash で  function od() { objdump -p $1 | grep "DLL Name"; }

libpng16-16.dll への参照が発生しました。これではダイナミックリンクになり、多数のファイルの配布が必要になってしまいます。

$ gcc -lpng a.c
C:\msys32\tmp\ccoKX062.o:a.c:(.text+0x2a): undefined reference to `png_init_io'
collect2.exe: error: ld returned 1 exit status

a.c の前につけたらダメですか。

$ gcc a.c -lpng -static
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(png.o):(.text+0x139b): undefined reference to `crc32'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(png.o):(.text+0x13ee): undefined reference to `crc32'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(png.o):(.text+0x2725): undefined reference to `adler32'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(png.o):(.text+0x2739): undefined reference to `adler32'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(png.o):(.text+0x2766): undefined reference to `crc32'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(png.o):(.text+0x277a): undefined reference to `crc32'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(png.o):(.text+0x1c62): undefined reference to `inflateReset'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngread.o):(.text+0x4b78): undefined reference to `inflateEnd'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngrutil.o):(.text+0x2fd): undefined reference to `inflateReset2'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngrutil.o):(.text+0x332): undefined reference to `inflateInit2_'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngrutil.o):(.text+0x4e8): undefined reference to `inflate'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngrutil.o):(.text+0x68a): undefined reference to `inflateReset'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngrutil.o):(.text+0xab7): undefined reference to `inflate'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngrutil.o):(.text+0x49f8): undefined reference to `inflate'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngrutil.o):(.text+0x4ab6): undefined reference to `inflate'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngrutil.o):(.text+0x5486): undefined reference to `inflateReset'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngwrite.o):(.text+0x1aba): undefined reference to `deflateEnd'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngwutil.o):(.text+0x61a): undefined reference to `deflateInit2_'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngwutil.o):(.text+0x662): undefined reference to `deflateEnd'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngwutil.o):(.text+0x6f2): undefined reference to `deflateReset'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngwutil.o):(.text+0xba5): undefined reference to `deflate'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.2.0/../../../../lib\libpng.a(pngwutil.o):(.text+0x2d7b): undefined reference to `deflate'
collect2.exe: error: ld returned 1 exit status

zlib が必要だそうです。

$ gcc a.c -lpng -lz -static

ビルドは通りました。

$ od a.exe
        DLL Name: KERNEL32.dll
        DLL Name: msvcrt.dll


スタティックリンクになりました。

$ gcc a.c -lpng -static -lz
$ gcc a.c -static -lpng -lz
$ gcc -static a.c -lpng -lz

-static の順序に関係なく、スタティックリンクになりました。

しかしこれで満足していません。追加で調査が必要です。。。

0 件のコメント:

コメントを投稿