????????本文操作按照《c&c++開源庫編譯指南》中內容規范編寫,編譯環境配置、工具下載、目錄規劃,及更多其他開源庫編譯方法請參考該文章。
????????c&c++開源庫編譯指南:https://blog.csdn.net/binary0006/article/details/144086155
????????本文章中的源代碼已提交到gitee倉庫,地址:https://gitee.com/binary0010/depends/tree/master/c/libpng-1.6.47
1.libpng編譯
1.1.源代碼下載
????????源代碼下載地址:https://sourceforge.net/projects/libpng/files/libpng16/1.6.47/,直接下載最新版1.6.47版本,點擊下圖所示鏈接直接下載即可。

????????也可以自己復制這個地址下載:https://sourceforge.net/projects/libpng/files/libpng16/1.6.47/libpng-1.6.47.tar.xz/download?
1.2.windows編譯
????????先解壓源代碼到指定目錄,libpng源代碼中已經提供了CMakeList.txt腳本,這里我們按照規范會對該腳本進行修改。

1.2.1.vs2008構建錯誤處理-mspdb80.dll錯誤?
????????在實踐VS2008使用CMake構建時,會彈出下面錯誤提示框,分析是libpng在CMake腳本中的定義項目是使用了ASM語言支持。
????????一路狂點確定之后好像也沒有什么影響,需要解決的話我們把mspdb80.dll、msobj80.dll、mspdbcore.dll、mspdbsrv.exe拷貝一份到cl.exe所在目錄即可,注意一定要拷貝上面4個文件,否則在編譯時會遇到錯誤。
????????下面有截圖給出了拷貝路徑。



?1.2.2.修改CMake腳本
????????修改CMake腳本按照我們的設計的編譯規范來進行構建和編譯,修改源代碼根目錄下的CMakeLists.txt即可。
????????腳本涉及的內容主要是使用自定義的FindZLIB.cmake腳本來查找依賴庫,以及mt工程的鏈接庫設置。由于腳本內容太多,這里就不粘貼全部代碼,僅截圖展示修改部分的內容,完整的編譯腳本,可以直接從文章開頭的gitee倉庫獲取。
????????CMakeLists.txt修改內容:?



1.2.3.vs2008編譯?
????????前面我們已經把CMakeLists.txt腳本按照規范修改完畢,下面我們將使用cmake來構建vs2008的工程和編譯。
1.2.3.1.cmake構建目錄設置
????????選擇源代碼根目錄(CMakeLists.txt文件在這個目錄),設置build目錄為源代碼根目錄下的cmake-vs2008絕對路徑為D:/x-app/depends/c/libpng-1.6.47/cmake-vs2008,保證源代碼目錄干凈,會生成工程和臨時文件,同時也方便后續有其他的構建工具擴展管理。

1.2.3.2.應用CMake配置
????????點擊“Configure”會彈出編譯器選擇對話框,這里選擇“Visual Studio 9 2008”點擊“Finish”按鈕等待配置參數完成。?


1.2.3.3.去掉不需要的編譯選項
????????因為前面CMakLists.txt腳本被我們修改了,所以這里一定要去掉下面截圖所示的4個選項,否則構建時CMake會報錯。

1.2.3.4.生成vs解決方案
????????下面的紅色警告忽略不用管,意思是未來的cmake版本不再支持生成vs2008的解決方案。?


?1.2.3.5.編譯工程
????????使用vs2008打開“libpng.sln”解決方案文件,分別編譯Debug和RelWithDebInfo配置。



?1.2.3.6.安裝庫文件、頭文件
????????編譯Install工程的Debug和RelWithDebInfo配置,.h文件和編譯生成.dll、.lib、pdb文件會拷貝CMakeList.txt中設置的路徑下。


????????至此通過一個CMakeLists配置文件將windows下vs2008常用編譯類型的庫全部編譯出來了,最終庫的對應關系如下。
| 庫類型 | 運行庫類型 | 庫文件 |
| 動態庫 | mdd | libpng16dlld.dll、libpng16dlld.lib |
| md | libpng16dll.dll、libpng16dll.lib | |
| mtd | libpng16dllmtd.dll、libpng16dllmtd.lib | |
| mt | libpng16dllmt.dll、libpng16dllmt.lib | |
| 靜態庫 | mdd | libpng16libd.lib |
| md | libpng16lib.lib | |
| mtd | libpng16libmtd.lib | |
| mt | libpng16libmt.lib |
1.2.4.vs2015編譯
????????vs2015編譯與vs2008相同的,只需要在CMake生成工程時選擇vs2015即可,其他版本的vs也是一樣的,選擇需要使用的vs版本即可,此處只演示一下vs2015的編譯。
????????因為前面生成過vs2008的工程,需要將build目錄設置成cmake-vs2015,再“Configure”選擇vs2015即可,其他操作就是一樣的了。



