之前在學習vtk過程中,感覺vtk的編譯還是很簡單的,基本上不會碰到什么棘手的錯誤。但是,當我在Win10+VS2015這個環境下配置時,卻遇到了麻煩。經過一番折騰之后,終於將vtkbian編譯成功了,這里做個小結,希望對大家有所幫助。
Step 1: 使用cmake3.3.0對vtk-6.2.0源碼進行configure操作
選擇VS2015 Win64選項作為編譯器設置
可能出現的錯誤:HDF5對64位位長數據支持檢測失敗
解決方案:這個是因為在HDF5配置源碼文件中缺少I64這個選項,添加I64選項即可解決
Step 2:使用cmake3.3.0對vtk-6.2.0源碼進行generate操作,生成vs工程
這里我在默認配置的基礎上勾選了BUILD_EXAMPLES和Module_vtkGUISupportMFC選項(因為我在開發的過程中會用到)
Step 3:以管理員方式打開VS2015,打開對應的sln文件
錯誤一:
19>D:\Softwares\vtk\VTK-6.2.0\Common\Core\vtkWin32ProcessOutputWindow.cxx(98): error C3688: 文本后綴"PRIdword"無效;未找到文文本運算符或文本運算符模板"operator """"PRIdword"
19>D:\Softwares\vtk\VTK-6.2.0\Common\Core\vtkWin32ProcessOutputWindow.cxx(99): error C2664: "int sprintf(char *const ,const char *const ,...)": 無法將參數 2 從"DWORD"轉換為"const char *const "
19> D:\Softwares\vtk\VTK-6.2.0\Common\Core\vtkWin32ProcessOutputWindow.cxx(99): note: 從整型轉換為指針類型要求 reinterpret_cast、C 樣式轉換或函數樣式轉換
解決方案:在D:\Softwares\vtk\VTK-6.2.0\Common\Core\vtkWin32ProcessOutputWindow.cxx第99行處進行如下修改:
//sprintf(exeName, "vtkWin32OWP_%"PRIdword"_%p_%u.exe",GetCurrentProcessId(), this, this->Count++);
sprintf(exeName, "vtkWin32OWP_%u_%p_%u.exe", GetCurrentProcessId(), this, this->Count++);
也就是將"PRIdword"替換為u。
錯誤二:
12>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt\corecrt_search.h(191): error C2375: "lfind": 重定義;不同的鏈接
12> d:\softwares\vtk\vtk-6.2.0\thirdparty\tiff\vtktiff\tiffiop.h(57): note: 參見"lfind"的聲明
解決方案:在d:\softwares\vtk\vtk-6.2.0\thirdparty\tiff\vtktiff\tiffiop.h中第57行處作如下修改:
在#ifdef HAVE_SEARCH_H 前面添加宏定義 #define HAVE_SEARCH_H。
錯誤三:
22>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt\stdio.h(1925): warning C4005: "snprintf": 宏重定義
22> D:\Softwares\vtk-build\ThirdParty\libxml2\vtklibxml2\config.h(254): note: 參見"snprintf"的前一個定義
22>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt\stdio.h(1927): fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration
解決方案:
在D:\Softwares\vtk-build\ThirdParty\libxml2\vtklibxml2\config.h中第252行處進行如下修改:
/* Win32 Std C name mangling work-around */
//#if defined(_MSC_VER)
//# define snprintf _snprintf
//#endif
即將此處的宏定義注釋掉,因為在VS2015中已經對snprintf提供了官方支持
在分別對ALL_BUILD和INSTALL進行生成操作后,結果如下:
好了,vtk編譯成功了,可以好好學習了。。。^_^