使用Microsoft Visual C++ 2010 Express编译GTK+

ㄚ琪用Mingw编译Glib 2.30.0失败了,主因是编译到需要Python时,Mingw不支援,这让人很是懊恼,看来要跨平台使用GTK不是那么简单,可是ㄚ琪又是一个很执着的人,所以还是另觅其他管道,这回要改用免费的Microsoft Visual C++ 2010 Express来编译了,你可能会想微软的GUI不是做得很好了,而且很简单,干嘛还这么麻烦来编译GTK,唉,这是GTK跨平台的坚持啊,而且因为Visual系列是Winodws下的主流,以及很多Linux-like的开发套件也支援Visual系列的编译,所以我们就转个方向吧。

希望这不会很难,而且Gnome的站上已经有这篇Compiling the GTK+ stack using Visual C++ 2008/2010,你会问我这篇是怎知道的,其实在GTK+-3.2.0的README.win32里头已有这样的介绍,看起来要迈向编译GTK 3可能就要用这种方式了。

准备

因为文章已有了,所以ㄚ琪就简述一路的操作,因为ㄚ琪是用Windows XP,所以要确认有cl.exe跟ml.exe,再来建立一些目录:

mkdir c:\gtk_compilation\vs10\Win32
mkdir c:\gtk_compilation\vs10\Win32\bin
mkdir c:\gtk_compilation\vs10\Win32\include
mkdir c:\gtk_compilation\vs10\Win32\lib

相关档案

1. ZLib

编辑win32/makefile.msc

CFLAGS  = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC)

改为

CFLAGS  = -nologo -MDd -W3 -Od -Zi -Fd"zlib" $(LOC)

主因是为了侦错使用。

使用Visual Studio 命令提示字元 (2010)进入zlib的目录编译:

cd $(the_folder_where_zlib_was_unpacked)

nmake -f win32/makefile.msc LOC="-DASMV -DASMINF" OBJA="inffas32.obj match686.obj"
/*这是针对32-bit用的*/

nmake -f win32/Makefile.msc AS=ml64 LOC="-I. -I.\win32 -DASMV -DASMINF" OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"
/*这是针对x86-64用的,这是一行的指令*/
一开始编译的时候,还发现:

adler32.c : fatal error C1902: 程式资料库管理员不相符; 请检查您的安装

NMAKE : fatal error U1077: ‘”C:\Program Files\Microsoft Visual Studio 10.0\VC\BI

N\cl.EXE”‘ : 传回码 ‘0x2’

Stop.

Orz.才刚开始困难就出现了,还好有解,只要把C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE下的mspdbsrv.exe复制到C:\Program Files\Microsoft Visual Studio 10.0\VC\bin也就是cl.exe所在的目录,真的就可以了,当然ㄚ琪也不再解释原因了,各位可以去Google看看原因,不过我猜啦,因为微软的东西有IDE加持,所以在视窗下使用比较不会有问题,不过命令列下编译可能会有一些档案路径没设对的问题发生。

之后真的再编译就成功了。

这里说:

-复制ZLib的根目录里的zlib.h跟zconf.h到c:\gtk_compilation\vs10\Win32\include

-复制Zlib的根目录里的zdll.lib跟zlib1.lib到c:\gtk_compilation\vs10\Win32\lib

(注:我只有zdll.lib跟zlib.lib两个档案,有点不一样,做mark起来注意

-复制Zlib的根目录里的zlib1.dll到c:\gtk_compilation\vs10\Win32\bin

2. LibPNG

文章中是使用中文的visual视窗介面的截图,英文说明,在x64的操作,ㄚ琪则以Win32为例来纪录这次的经验:

ㄚ琪下载的是lpng155.zip

解压缩然后进到lpng155\projects\vstudio,开启vstudio.sln

2011-10-04_105711

ㄚ琪手快已经把pngvalid下的zlib砍掉了,而且1.55版的跟原文有些许出入。

另外Win32的组态原本就有了,所以就不用再新增。

进入每个专案的属性页,其实ㄚ琪只有玩libpng这个属性页。

2.1.原文是新增zlib1.lib (或 zlib1d.lib)但是我只有zlib.lib,而且与原设定同,不修改

2011-10-04_103714

2.2.新增c:\gtk_compilation\vs10\Win32\include到C/C++->一般的其他Include目录中

2011-10-04_103916

2.3. 新增c:\gtk_compilation\vs10\Win32\lib到连结器->一般的”其他程式库目录”中。

2011-10-04_104032

ㄚ琪使用组态: Release Win32编译时会有

正在建立程式库 D:\source\C\lpng155\projects\vstudio\Release\libpng15.lib 和物件 D:\source\C\lpng155\projects\vstudio\Release\libpng15.exp

LINK : warning LNK4098: 预设的程式库 ‘MSVCRTD’ 与其他使用的程式库冲突,请使用 /NODEFAULTLIB:library

这样的警告,而且建置: 1 成功、0 失败、1 最新、0 略过,有一个编译失败了。

但是在组态: Debug Win32编译时,是全部重建: 2 成功、0 失败、 0 略过,却是成功了,看起来可能是zlib是侦错模式的编译才有这样的状况

放置档案到下列的位置:

  • -复制png.h、pngconf.h、pnglibconf.h及pngpriv.h到c:\gtk_compilation\vs10\Win32\include

    -复制libpng15.lib [或侦错模式的libpng15d.lib] 到c:\gtk_compilation\vs10\Win32(ㄚ琪侦错模式下还是为libpng15.lib

    -复制libpng15.dll [或侦错模式的libpng15d.dll]到c:\gtk_compilation\vs10\Win32\bin(ㄚ琪侦错模式下还是libpng15.dll

3. Pixman Library

这里的说明ㄚ琪实做的时候有点怀疑纳闷,所以先测试一下,下载的是pixman-0.22.2.tar.gz,解压缩程式挡到c:\gtk_compilation\,下载pixman-vsproj.zip,解压缩到c:\gtk_compilation,开启build\win32\vs10下的pixman.sln,然后依据选择事组态来建置,.DLL、.Lib跟标头档复制到适当的地方(在 c:\gtk_compilation\vs10\Win32\bin、c:\gtk_compilation\vs10\Win32\lib跟c:\gtk_compilation\vs10\Win32\include下,这里头ㄚ琪奇怪的就是有需要一定要复制到c:\gtk_compilation下吗?看起来不用,因为如果这样就跟前面的建置模式有点不同了,可是建置成功后的复制动作,却又没什么差异。另外ㄚ琪在开启pixman.sln时,会有下面的警告

C:\gtk_compilation\build\win32\vs10\pixman.vcxproj : warning  : 找不到专案档 ‘pixman’ 中参考的平台 ‘x64’。请确认您是否将它安装在 ‘%VCTargetsPath%\Platforms\x64’ 之下。

C:\gtk_compilation\build\win32\vs10\install.vcxproj : warning  : 找不到专案档 ‘install’ 中参考的平台 ‘x64’。请确认您是否将它安装在 ‘%VCTargetsPath%\Platforms\x64’ 之下。

疑似ㄚ琪的平台不是x64的关系,先暂时不管。

4. IJG JPEG library

下载最新的jpegsr8c.zip,解压缩到jpeg-8c中,原文中有两个步骤,似乎是选择其中一种就行,但是ㄚ琪不是很了解是否有问题,所以两种步骤都执行:

1.就是要建立static的library,因为ㄚ琪使用Visual C++ 2010 Express,所以没注意他说的Visual C++ 2008的情况会有什么事?。

1.1 到jpeg-8c,然后复制改名jconfig.vc为jconfig.h

1.2 命令列字元下执行

nmake -f makefile.vc

 (ㄚ琪使用侦错模式)
nmake -f makefile.vc NODEBUG=1 (Release)

2.是dll模式的建置。

2.1 下载makefile.vcjmorecfg.h,然后放到jpeg-8c下,注这两个档案原本就有了,所以ㄚ琪保守其见改名不覆盖

2.2 执行

nmake -f makefile.vc DLL=1

(ㄚ琪使用侦错模式)
nmake -f makefile.vc DLL=1 NODEBUG=1 (Release)

3.

-jconfig.h、jerror.h、jmorecfg.h跟jpeglib.h在c:\gtk_compilation\vs10\Win32\include

-libjpeg.lib在c:\gtk_compilation\vs10\Win32\lib

-libjpeg.dll在c:\gtk_compilation\vs10\Win32\bin — 只有DLL下编译才有

-所有的.exe档在c:\gtk_compilation\vs10\Win32\bin

5. LibTIFF

踢到铁板了,错误真多,大挫折来了。(2011/10/04)