前提安裝了visual studio 2015 PS.幾乎所有方式,x64的編譯都會有點坑,鑒於網上的x86編譯方式非常的多,所以不再累贅x86的編譯方式
zlib下載源:
官網:http://zlib.net/
下載:http://zlib.net/zlib128.zip
方式一:命令方式
1、解壓zlib128.zip,隨便一個地方即可,本人解壓在E:\zlib128\zlib-1.2.8,zlib-1.2.8為根目錄
2、這個方式之下,首先需要將visual studio的VC目錄就加入到系統的環境變量中,在system的Advanced system settings(高級系統設置),在Advanced(高級)最下方,點擊Enviroment Variable(環境變量),System Variables(系統變量)的Path,添加對應的VC目錄路徑,(Visual Studio不分x86和x64,主要部分安裝在Program Files(x86)中)本人的目錄為C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC ,添加之后注銷或者重啟
3、打開開始菜單,選擇Visual Studio 2015文件夾(Visual Studio之后就會有),選擇VS2015 x64 Native Tools Command Prompt(VS2015 x64本地命令行工具),(此處注意,很多教程需要使用此工具到zlib-1.2.8的contrib/masmx64下面執行bld_ml64.bat生成inffasx64.obj之類的文件,然后拷貝到根目錄,再執行蝦米那的步驟,其實這些步驟是多余的),大家可以注意到zlib-1.2.8根目錄下有一個文集愛你家為win32,這個就是編譯的關鍵,打開里面有個文件為Makefile.msc,這個就是nmake需要用到的makefile。用editpad打開文件可以看到如下:
PS.之所以說其他教程的一些工作是多余的,是因為在文件中的如下內容會自動的尋找相關的asm(匯編語言源程序文件)以及.h,.c文件,生成對應的obj文件
gvmat64.obj: $(TOP)/contrib\masmx64\gvmat64.asm inffasx64.obj: $(TOP)/contrib\masmx64\inffasx64.asm inffas8664.obj: $(TOP)/contrib\masmx64\inffas8664.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h \ $(TOP)/inftrees.h $(TOP)/inflate.h $(TOP)/inffast.h
接下來,看文件內容,在最開始的注釋處就有編譯的方式
# Usage: # nmake -f win32/Makefile.msc (standard build) # nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build) # nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \ # OBJA="inffas32.obj match686.obj" (use ASM code, x86) # nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." \ # OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" (use ASM code, x64)
於是接下來,在命令行中輸入e:跳轉到e盤,輸入cd E:\zlib128\zlib-1.2.8到根目錄,輸入nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj",程序就會跑起來,如圖:
至此,已經編譯完成,在根目錄下會出現相關的結果文件zlib.lib,zlib1.dll,zlib.pdb等等。
注意,如果不添加系統環境變量,或者不把VC\bin\amd64\ml64.exe拷貝到根目錄下的話,運行編譯完makefile中的一些必須的32位的obj后就會報錯停止如下
提示1: inffas8664.c lib -nologo -out:zlib.lib adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj gzwrite.obj infback.obj inflate.obj inftrees.obj inffast.obj trees.obj uncompr.obj zutil.obj inffasx64.obj gvmat64.obj inffas8664.obj inffasx64.obj : fatal error LNK1112: 模塊計算機類型“x64”與目標計算機類型“X86”沖突 NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\lib.EXE"”: 返回代碼“0x458” Stop. 提示2: ml64 -c -coff -Zi -DASMV -DASMINF -I. ./contrib/masmx64\inffasx64.asm 'ml64' 不是內部或外部命令,也不是可運行的程序 或批處理文件。 NMAKE : fatal error U1077: “ml64”: 返回代碼“0x1” Stop.
方式二:使用visual studio ide進行編譯
PS.此處有些教程包括x86編譯,也會重復去執行類似到masmx64執行bld_ml64.bat的工作,然后拷貝到根目錄后再打開visualstudio,其實這些也是不需要的工作,因為IDE的工作其實就是再背后悄悄的執行Makefile里面的編譯鏈接工作,只不過不那么直觀的展示給你看而已。
1、打開E:\zlib128\zlib-1.2.8\contrib\vstudio\vc11,雙擊zlibvc.sln,Visual Studio 2015就會將其打開,但是這個sln是用vs2012創建的,所以會彈窗提示,需要更新相關的文件配置如圖,點擊確定即可
2、接下來吧菜單欄中的輸出平台選擇位x64,右鍵點擊zlibvc,在彈出菜單中點擊build,就會開始報錯如下
Severity Code Description Project File Line Suppression State Error MSB3073 The command "cd ..\..\contrib\masmx64 bld_ml64.bat :VCEnd" exited with code 9009. zlibvc C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets 123
這個錯誤的產生鞥是來自生成時間中的預生成事件,因為無法准確的通過路徑找到bat文件執行
3、解決方法如下:右鍵點擊zlibvc,在彈出菜單中選擇Properties(屬性),在彈出的屬性對話框選擇Build Event(生成事件),點擊Pre-Build Event(預先生成事件),會看到Command Line(命令行)中有錯誤提示所示的命令行,在這里我們對其進行修改,點擊命令旁邊的下拉按鈕,然后點擊edit(編輯),把內容刪掉,替換如下:(此處的內容可參照命令行方式)
E: cd E:\zlib128\zlib-1.2.8\contrib\masmx64 bld_ml64.bat
注意此處就是執行生成inffasx64.obj和gvmat64.obj的工作,因為再IDE中沒有去鏈接asm,就會以來預先時間執行腳本生成,看看bld_ml64.bat腳本內容就會明白,他們會在本目錄下生成對應的lst文件和obj,其他的拷貝鏈接工作IDE會在背后完成,如下
ml64.exe /Flinffasx64 /c /Zi inffasx64.asm ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
添加號之后取人關閉,然后重新執行第二步進行編譯,發現已經開始正常的編譯了,但是后面又報了個錯如下,只需要雙擊錯誤,就會自動打開一個.def文件,將Verson一行的1.2.8改為1.28,然后保存
Severity Code Description Project File Line Suppression State Error LNK1118 syntax error in 'VERSION' statement zlibvc E:\zlib128\zlib-1.2.8\contrib\vstudio\vc11\zlibvc.def 4
重新執行第二部操作進行編譯,此時就會提示成功的消息,如下
1>------ Build started: Project: zlibvc, Configuration: Debug x64 ------ 1> Microsoft (R) Macro Assembler (x64) Version 14.00.24210.0 1> Copyright (C) Microsoft Corporation. All rights reserved. 1> 1> Assembling: inffasx64.asm 1> Assembling: gvmat64.asm 1> Microsoft (R) Macro Assembler (x64) Version 14.00.24210.0 1> Copyright (C) Microsoft Corporation. All rights reserved. 1> 1> Creating library x64\ZlibDllDebug\zlibwapi.lib and object x64\ZlibDllDebug\zlibwapi.exp 1> zlibvc.vcxproj -> E:\zlib128\zlib-1.2.8\contrib\vstudio\vc11\x64\ZlibDllDebug\zlibwapi.dll 1> zlibvc.vcxproj -> x64\ZlibDllDebug\zlibwapi.pdb (Full PDB) ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
在E:\zlib128\zlib-1.2.8\contrib\vstudio\vc11\x64\ZlibDllDebug目錄下就會出現對應的輸出文件,如圖
至此,所有的編譯工作完成,PS.x86的visual studio ide編譯方式,不需要修改任何東西即可編譯完成。