win10下Visual Studio 2015,C++ x64編譯zlib


前提安裝了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編譯方式,不需要修改任何東西即可編譯完成。

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM