使用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_compilationvs10Win32
mkdir c:gtk_compilationvs10Win32bin
mkdir c:gtk_compilationvs10Win32include
mkdir c:gtk_compilationvs10Win32lib

相關檔案

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 FilesMicrosoft Visual Studio 10.0VCBI

Ncl.EXE”‘ : 傳回碼 ‘0x2’

Stop.

Orz.才剛開始困難就出現了,還好有解,只要把C:Program FilesMicrosoft Visual Studio 10.0Common7IDE下的mspdbsrv.exe複製到C:Program FilesMicrosoft Visual Studio 10.0VCbin也就是cl.exe所在的目錄,真的就可以了,當然ㄚ琪也不再解釋原因了,各位可以去Google看看原因,不過我猜啦,因為微軟的東西有IDE加持,所以在視窗下使用比較不會有問題,不過命令列下編譯可能會有一些檔案路徑沒設對的問題發生。

之後真的再編譯就成功了。

這裡說:

-複製ZLib的根目錄裡的zlib.h跟zconf.h到c:gtk_compilationvs10Win32include

-複製Zlib的根目錄裡的zdll.lib跟zlib1.lib到c:gtk_compilationvs10Win32lib

(註:我只有zdll.lib跟zlib.lib兩個檔案,有點不一樣,做mark起來注意

-複製Zlib的根目錄裡的zlib1.dll到c:gtk_compilationvs10Win32bin

2. LibPNG

文章中是使用中文的visual視窗介面的截圖,英文說明,在x64的操作,ㄚ琪則以Win32為例來紀錄這次的經驗:

ㄚ琪下載的是lpng155.zip

解壓縮然後進到lpng155projectsvstudio,開啟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_compilationvs10Win32include到C/C++->一般的其他Include目錄中

2011-10-04_103916

2.3. 新增c:gtk_compilationvs10Win32lib到連結器->一般的”其他程式庫目錄”中。

2011-10-04_104032

ㄚ琪使用組態: Release Win32編譯時會有

正在建立程式庫 D:sourceClpng155projectsvstudioReleaselibpng15.lib 和物件 D:sourceClpng155projectsvstudioReleaselibpng15.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_compilationvs10Win32include

    -複製libpng15.lib [或偵錯模式的libpng15d.lib] 到c:gtk_compilationvs10Win32(ㄚ琪偵錯模式下還是為libpng15.lib

    -複製libpng15.dll [或偵錯模式的libpng15d.dll]到c:gtk_compilationvs10Win32bin(ㄚ琪偵錯模式下還是libpng15.dll

3. Pixman Library

這裡的說明ㄚ琪實做的時候有點懷疑納悶,所以先測試一下,下載的是pixman-0.22.2.tar.gz,解壓縮程式擋到c:gtk_compilation,下載pixman-vsproj.zip,解壓縮到c:gtk_compilation,開啟buildwin32vs10下的pixman.sln,然後依據選擇事組態來建置,.DLL、.Lib跟標頭檔複製到適當的地方(在 c:gtk_compilationvs10Win32bin、c:gtk_compilationvs10Win32lib跟c:gtk_compilationvs10Win32include下,這裡頭ㄚ琪奇怪的就是有需要一定要複製到c:gtk_compilation下嗎?看起來不用,因為如果這樣就跟前面的建置模式有點不同了,可是建置成功後的複製動作,卻又沒什麼差異。另外ㄚ琪在開啟pixman.sln時,會有下面的警告

C:gtk_compilationbuildwin32vs10pixman.vcxproj : warning  : 找不到專案檔 ‘pixman’ 中參考的平台 ‘x64’。請確認您是否將它安裝在 ‘%VCTargetsPath%Platformsx64’ 之下。

C:gtk_compilationbuildwin32vs10install.vcxproj : warning  : 找不到專案檔 ‘install’ 中參考的平台 ‘x64’。請確認您是否將它安裝在 ‘%VCTargetsPath%Platformsx64’ 之下。

疑似ㄚ琪的平台不是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_compilationvs10Win32include

-libjpeg.lib在c:gtk_compilationvs10Win32lib

-libjpeg.dll在c:gtk_compilationvs10Win32bin — 只有DLL下編譯才有

-所有的.exe檔在c:gtk_compilationvs10Win32bin

5. LibTIFF

踢到鐵板了,錯誤真多,大挫折來了。(2011/10/04)

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *