VTK编译安装
2、VTK編譯安裝
學(xué)習(xí)VTK最好是從下載VTK源碼,然后自己編譯開始。編譯VTK是很簡單的一件事情,最重要的是把準備工作做好。本章將會詳細演示如何編譯安裝VTK。
這里提到的VTK開發(fā)環(huán)境為:Windows 7旗艦版64位操作系統(tǒng),Visual Studio 2008集成開發(fā)環(huán)境,CMake 2.8.6,Qt 4.8.2以及VTK 5.10 Release版本。后續(xù)所有的程序示例代碼都是在這個環(huán)境下測試通過的。
2.1????????編譯VTK的準備工作
首先,你的計算機必須安裝了VisualStudio 2008。如果采用其他集成開發(fā)環(huán)境(IDE)的,也必須先安裝對應(yīng)的IDE工具。編譯64位版本的VTK之前,在安裝Visual Studio 2008的時候,需要安裝相應(yīng)的64位組件。
其次,安裝CMake。CMake下載地址:http://www.cmake.org/cmake/resources/software.html。Windows平臺下只要下載文件cmake-2.8.6-win32-x86.exe即可。安裝完CMake以后,運行界面如圖2.1所示。
圖2.1CMake界面
如果你在這之前沒有聽說過CMake,也不知道CMake如何使用,先不要著急。假如你實在比較急的話,可以先去Google或者百度一下CMake到底是個什么東西。
接著,如果你想自己編譯VTK類庫的幫助文檔的話,還需要安裝Doxygen工具。這一步不是必須的。
此外,如果你想使用Tcl、Python或者Java等語言開發(fā)的話,相應(yīng)的工具也必須先安裝。相關(guān)的文件可以從以下頁面下載到:Tcl/Tk下載地址:http://www.tcl.tk/software/tcltk/;Python下載地址:http://www.python.org/;Java下載地址:http://www.java.com/。
最后,確定你想使用哪種工具作為界面開發(fā),比如MFC、Qt、FLTK等等。以這個系列教程為例,采用Qt作為GUI(用戶圖形界面)開發(fā)工具,那么在安裝VTK之前還必須安裝Qt,Windows平臺下的Qt Opensource編譯版本可以從以下頁面下載(http://qt-project.org/downloads/和http://code.google.com/p/qt-msvc-installer/downloads/list)。
換言之,如果你想使用C++作為開發(fā)語言,采用Qt作為GUI開發(fā)工具,但不想編譯VTK的幫助文檔(因為已經(jīng)有現(xiàn)成的,編譯幫助文檔的時間也會比較長),那么在編譯VTK之前,只要安裝VisualStudio 2008、CMake和Qt即可。
2.2????????編譯VTK的詳細步驟
將下載到的VTK源碼文件vtk-5.10.0.zip解壓到某個磁盤下,比如,解壓到D:\Toolkits\VTK\VTK-5.10。然后,建立一個空的文件夾,叫什么名字無所謂,只要不含有中文即可(為了讓文件名看起來規(guī)整統(tǒng)一,新建的文件夾命名為VTK-5.10-bin,完整的路徑為:D:\Toolkits\VTK\VTK-5.10-bin)。接著解壓下載的vtkdata-5.10.0.zip文件,比如解壓到:D:\Toolkits\VTK\VTKData (如果你沒有下載vtkdata-5.10.0.zip文件,這一步也可以跳過)。
然后,打開CMake(界面如圖2.1所示),在CMake界面上的“Where is the source code”文本框里輸入前一步解壓vtk-5.10.0.zip之后的路徑,即D:\Toolkits\VTK\VTK-5.10。也就是這個文本框應(yīng)該輸入VTK源碼目錄里最外層的CMakeLists.txt文件所在的路徑。接著,在“Where to build the binaries”文本框里輸入前一步新建的空文件夾的路徑,即D:\Toolkits\VTK\VTK-5.10-bin,這個文本框所輸?shù)穆窂娇梢愿癢here is the source code”的一樣,分開兩個不同的路徑的好處是后續(xù)編譯過程生成的文件不會跟VTK的源碼混合在一起,避免對源碼目錄的“污染”,這也是后續(xù)內(nèi)容介紹的CMake的“in-place”和“out-of-place”的區(qū)別。
以上兩個文本框輸入完之后,按“Configure”按鈕,會彈出如圖2.2所示的對話框,根據(jù)你自己的需要以及你計算機已經(jīng)安裝的IDE、編譯器等選擇適當(dāng)?shù)倪x項即可,比如,使用Visual Studio 2008,準備編譯64位的VTK,則可以選擇“Visual Studio 9 2008 Win64”選項(如果選擇錯誤,要重新選擇IDE選項的話,停止CMake的配置或者生成過程,點擊CMake的File菜單下的Delete Cache之后,再重新用CMake配置VTK的時候就會重新彈出圖2.2的對話框),然后確定,CMake即開始根據(jù)具體的平臺環(huán)境配置VTK工程(配置時間會因硬件配置的不同而不同,一般需要幾分鐘時間)。
?
圖2.2CMake選擇編譯環(huán)境的對話框
?
配置完成后,CMake界面如圖2.3所示。
圖2.3首次配置完VTK后的界面
關(guān)于VTK的一些CMake配置選項的說明:
BUILD_EXAMPLES —默認是關(guān)閉的,如果打開這個選項,則會編譯VTK例子,同時VTK編譯所需的時間也較長,占用的磁盤空間也較大。對于初學(xué)者來說,建議把這個選項打開。
BUILD_SHARED_LIBS —默認是關(guān)閉的,意味著VTK是靜態(tài)編譯;如果打開這個選項,則是動態(tài)編譯。
“靜態(tài)編譯”與“動態(tài)編譯”的區(qū)別:靜態(tài)編譯就是在編譯的時候把所有的模塊都編譯進可執(zhí)行文件(exe)里去,當(dāng)啟動這個可執(zhí)行文件時所有的模塊都已加載進來。動態(tài)編譯則是編譯的時候需要的模塊都沒有編譯進去,一般情況下可以把這些模塊都編譯成動態(tài)鏈接庫DLL,啟動程序(初始化)的時候這些模塊不會被加載,運行的時候用到那個模塊就調(diào)用哪個DLL文件。靜態(tài)鏈接庫編譯相當(dāng)于你帶著一個工具包到處跑,遇到有需要的地方不需要周圍的環(huán)境提供相應(yīng)的工具,自己用自己工具包的工具就行了,所以當(dāng)環(huán)境發(fā)生變化可以盡可能的無視;動態(tài)鏈接庫編譯相當(dāng)于不帶任何東西,走到哪是哪。這兩者的區(qū)別顯然就是前者重量增加了,即程序的體積會比后者的大。
所以,究竟是用“靜態(tài)編譯”還是“動態(tài)編譯”,關(guān)鍵看自己的需要。對于VTK初學(xué)者而言,所涉及到的工程可能都比較小,建議用“靜態(tài)編譯”,也方便把VTK程序移植到其他沒有安裝VTK的計算機上運行。本書的VTK類庫是采用靜態(tài)編譯。
BUILD_TESTING —默認是打開的,表示會編譯VTK的測試程序。VTK里每個類都有對應(yīng)的程序文件對該類進行測試,對于初學(xué)者而言,可以關(guān)閉掉這個選項,后續(xù)如有需要,可以再打開此選項。
VTK_DATA_ROOT —指向VTKData所在的路徑,即第1章里下載的文件vtkdata-5.10.0.zip解壓后的路徑。一般情況下,VTK能夠自動搜索到,如果沒有搜索到可以手動輸入,在運行VTK的例子時需要用到這些數(shù)據(jù)。
CMAKE_INSTALL_PREFIX —這個選項表示VTK的安裝路徑,默認的路徑是:C:/Program Files/VTK。該選項的值可不作更改,按默認值即可。
VTK_USE_QT —是否使用Qt。在這個系列里,我們使用Qt作為GUI開發(fā)工具,所以勾上該選項。
VTK_WRAP_JAVA、VTK_WRAP_PYTHON、VTK_WRAP_TCL —這三個選項是供準備使用Java、Python或者Tcl語言開發(fā)VTK工程的用戶選擇的。VTK由兩個子系統(tǒng)組成,分別是C++類庫和提供給Java、Tcl和Python來操作該類庫的解釋器工具,如果勾上以上三個選項,即會編譯這些解釋器工具。
勾選圖2.3的“Advance”復(fù)選框,可以在CMake界面上看到更多的選項,各選項分別表示什么意思,可以把鼠標在該選項名字停留片刻,即會彈出關(guān)于該選項的提示信息。另外“Advance”視圖下以下幾個選項需要說明一下:
BUILD_DOCUMENTATION —默認是關(guān)閉的,如果打開這個選項,則會編譯VTK幫助文檔,由于這個文檔VTK已提供下載,所以可以不選。
VTK_USE_GUISUPPORT — VTK是否支持GUI,Windows下如果需要使用MFC開發(fā)的,需要勾選上這個選項。本教程在演示的時候也會把這個選項勾選,如果你確定不使用MFC,可以不用選擇該選項。
定制每個選項的值以后,按“Configure”按鈕,繼續(xù)配置,CMake界面如圖2.4所示。
圖2.4定制完CMake選項,再Configure后的界面
由于在前一步里勾選了VTK_USE_GUISUPPORT,所以Configure以后會有新的紅色選項VTK_USE_MFC出現(xiàn),如果確定要使用MFC,需要把這個選項再次勾上。
繼續(xù)按“Configure”按鈕,直到?jīng)]有紅色的選項出現(xiàn),然后按“Generate”按鈕,開始生成VTK工程文件。這一步完成以后,打開在“Where to build thebinaries”里輸入的路徑,即D:\Toolkits\VTK\VTK-5.10-bin,可以看到如圖2.5所示的目錄結(jié)構(gòu)。
接著雙擊該目錄下的VTK.sln文件,打開VTK工程,如圖2.6所示。Visual Studio 2008默認的編譯版本是Debug,對于初學(xué)者來說,最好選擇該版本進行編譯,以方便后續(xù)程序的調(diào)試。由于我們在CMake最開始選擇編譯環(huán)境時選擇的是“Visual Studio 9 2008 Win64”,所以Visual Studio 2008上顯示的就是“X64”版本,即64位的。選擇Visual Studio 2008里的Build菜單->Build Solution(或者按F7鍵,關(guān)于快捷鍵可能有些版本的VS2008會不一樣),開始編譯VTK。計算機的配置情況不同,所需的編譯時間也不一樣,如果計算機配置還過得去的話,圖2.6的118個工程編譯下來的時間大約需要半小時左右。
圖2.5用CMake配置完VTK生成的工程文件
?
圖2.6打開VTK.sln后的界面,根據(jù)CMake的選項不同,該項目所包含的工程數(shù)目也不相同。該圖顯示的選擇編譯Example,沒有選擇編譯Testing,一共有118個工程。
編譯完成后,對應(yīng)的Debug目錄會生成如下文件:
圖2.7VTK Debug版本下生成的文件
如果采用動態(tài)編譯,在圖2.7所在的目錄,會生成對應(yīng)的動態(tài)鏈接庫DLL文件。至此,VTK編譯完成。如果你還想把VTK相關(guān)的頭文件、lib文件等提取出來,以便用于其他項目的開發(fā),可以編譯Solution下的“INSTALL”工程,右擊該工程,選擇菜單:“Project Only” -> “Build Only INSTALL”,VTK里所有的頭文件以及相關(guān)的庫文件等,即會被提取到你在CMAKE_INSTALL_PREFIX里指定的路徑里,默認的路徑是:C:/Program Files/VTK。
注意:由于Windows 7有管理員權(quán)限的問題,如果直接雙擊VTK.sln,然后編譯INSTALL工程的話,會提示不能在C:\Program Files\下創(chuàng)建目錄等錯誤,此時可以先關(guān)閉掉VTK工程,在“開始”->“搜索程序及文件”一欄輸入Visual Studio 2008,然后右擊該程序,選擇“管理員權(quán)限運行”Visual Studio 2008,接著在Visual Studio 2008下通過菜單打開VTK.sln文件,再重新編譯INSTALL工程。
至此,就成功地編譯并安裝好了VTK。如果在編譯安裝VTK的過程中出現(xiàn)什么問題,可以在VTK users郵件列表上提問。
2.3????????創(chuàng)建一個簡單的VTK程序
在2.2一節(jié)里,我們詳細講解了如何編譯、安裝VTK,那么如何測試VTK到底有沒有正確地安裝,或者說怎么使用我們在前面編譯出來的VTK函數(shù)庫呢?
首先我們需要寫一個CMakeLists.txt文件。前面的內(nèi)容我們已經(jīng)接觸了CMake,也用CMake來配置過VTK工程,下面我們先看看CMake的介紹。
2.3.1 什么是CMake?
對于每個使用VTK的開發(fā)人員來說,必須認識的一個工具就是CMake,CMake的產(chǎn)生與發(fā)展也與VTK息息相關(guān)。以下一段內(nèi)容摘自維基百科,主要是關(guān)于CMake的歷史:
“CMake是為了解決美國國家醫(yī)學(xué)圖書館出資的Visible Human Project項目下的 Insight Segmentation andRegistration Toolkit (ITK)軟件的跨平臺構(gòu)建的需求而創(chuàng)造出來的,其設(shè)計受到了Ken Martin開發(fā)的pcmaker的影響。pcmaker 當(dāng)初則是為了支援Visualization Toolkit (VTK)這個開源的三維圖形和視覺系統(tǒng)才出現(xiàn)的,現(xiàn)在VTK也采用了CMake。”
從以上關(guān)于CMake的介紹可以知道,CMake其實就是一個跨平臺的工程構(gòu)建工具,可以根據(jù)不同的平臺生成與平臺相關(guān)的工程配置文件,比如Windows平臺采用Visual Studio,則可以生成*.dsw/*.sln等項目文件。利用CMake可以管理大型的項目,VTK就是使用了CMake作為項目管理工具。同時CMake也簡化了工程構(gòu)建過程,只要給工程里的每個目錄都寫一個CMakeLists.txt,就可以生成出該工程的編譯文件。CMake支持in-place構(gòu)建(也就是生成的二進制文件跟源文件在同一個目錄)和out-of-place構(gòu)建(編譯鏈接生成的二進制文件和源文件分別在不同的目錄,前面我們講VTK編譯過程時就是采用這種構(gòu)建方式)兩種工程構(gòu)建方式。
CMake有自己的語言和語法,用CMake對工程進行管理的過程,就是編寫CMakeLists.txt腳本文件的過程,原則上要求工程里的每一個目錄都包含一個同名的文件,而且這個文件的名字只能是:CMakeLists.txt。假如寫成cmakelists.txt,由于Windows不區(qū)別文件名大小寫,所以可以通過;但如果在別的平臺,如Ubuntu,用CMake構(gòu)建工程時就會提示找不到CMakeLists.txt,所以建議,不管在哪個平臺下,都使用CMakeLists.txt這個文件名,注意大小寫。
2.3.2 寫一個簡單的CMakeLists.txt腳本文件
為了測試是否成功安裝了VTK,我們可以建立一個簡單的VTK工程進行試驗。本書里提到的所有示例都是用CMake進行管理,因此需要先寫一個CMakeLists.txt文件。同樣先新建一個文件夾(為便于本教程后續(xù)示例工程文件的管理,我們在前面VTK的安裝目錄里新建一個名為Examples的文件夾,Examples文件夾里存放本教程里提到的所有程序示例,每個程序示例的命名風(fēng)格為XXX_ProjectName,XXX表示示例所在的章節(jié)編號,ProjectName為工程的名字,比如以下測試示例命名為:2.3.2_TestVTKInstall,在本教程完整的路徑為:D:\Toolkits\VTK\Examples\2.3.2_TestVTKInstall,接下來的內(nèi)容,你可以暫時不要急著問為什么,先按照描述步驟一步一步跟著試做一遍,后面的內(nèi)容會逐行代碼地解釋,所以暫時你先“知其然”,后續(xù)的內(nèi)容會讓你“知其所以然”)。
然后在該目錄下新建一個名為CMakeLists.txt的記事本文件。輸入內(nèi)容為:
?
cmake_minimum_required(VERSION2.8)
project(TestVTKInstall)
find_package(VTKREQUIRED)
include(${VTK_USE_FILE})
add_executable(${PROJECT_NAME}TestVTKInstall.cpp)
target_link_libraries(${PROJECT_NAME}vtkRendering vtkCommon)
?
接著在2.3.2_TestVTKInstall目錄下新建一個cpp文件,名字名為TestVTKInstall.cpp,輸入內(nèi)容為:
?
#include"vtkRenderWindow.h"
#include"vtkSmartPointer.h"
intmain()
{
?vtkSmartPointer<vtkRenderWindow> renWin= vtkSmartPointer<vtkRenderWindow>::New();
?renWin->Render();
?
?std::cin.get();
?return 0;
}
?
也就是在D:\Toolkits\VTK\Examples\2.3.2_TestVTKInstall目錄下有兩個文件,分別為CMakeLists.txt和TestVTKInstall.cpp。打開CMake程序,在CMake的“Where is the source code”一欄輸入路徑:D:\Toolkits\VTK\Examples\2.3.2_TestVTKInstall,在“Where to build the binaries”一欄輸入路徑:D:\Toolkits\VTK\Examples\2.3.2_TestVTKInstall\bin,接著按“Configure”按鈕,CMake會彈出圖2.8的對話框。
圖2.8CMake詢問是否創(chuàng)建不存在的路徑
選擇“Yes”,然后再選擇我們準備采用的編譯環(huán)境“Visual Studio 2008Win64”,CMake開始配置工程。這個工程非常小,很快就配置完成,接著在CMake界面上會出現(xiàn)一些紅色的選項,如果沒有勾選“Advance”視圖,默認顯示出來的選項只有兩項,分別是:CMAKE_INSTALL_PREFIX以及VTK_DIR,前一個選項我們已經(jīng)知道是什么意思,VTK_DIR這個選項就是指向編譯的VTK目錄,即D:/Toolkits/VTK/VTK-5.10-bin,準確地說,這個路徑就是VTKConfig.cmake文件所在的完整路徑。對于CMAKE_INSTALL_PREFIX這個選項默認的值都是C:\Program Files\XXX (XXX指的就是你在CMakeLists.txt里的project(XXX)命令里填寫的工程名字)。對于VTK_DIR,一般情況下,在你編譯完VTK以后,用CMake配置VTK的工程時,會自動找到這個路徑,如果CMake找不到,或者找到的不是你想要的VTK版本(假如你的計算機已經(jīng)編譯多個版本的VTK時),可以通過“Browse Build…”按鈕選擇需要的VTK編譯路徑,或者直接輸入該路徑。
設(shè)置完選項的值以后,再次“Configure”,直到?jīng)]有紅色的選項出現(xiàn),最后“Generate”。完成以后打開在“Whereto build the binaries”一欄指定的路徑D:\Toolkits\VTK\Examples\2.3.2_TestVTKInstall\bin,生成的文件如圖2.9所示。
圖2.9用CMake構(gòu)建TestVTKInstall工程所生成的文件
打開我們熟悉的*.sln文件,即TestVTKInstall.sln,按鍵盤F7鍵開始編譯工程,完成以后按F5運行,如果沒有其他意外,會彈出圖2.10的對話框。
圖2.10Executable For Debug Session對話框
對于不熟悉VisualStudio 2008的初學(xué)者而言,會以為這是一種錯誤,其實只是項目默認的啟動工程沒有生成可執(zhí)行文件而已。右擊“Solution Explorer”里的“TestVTKInstall”工程,然后選擇“Set as StartUp project”,再次F5,運行界面如圖2.11所示。靠前的是VTK窗口,靠后的是控制臺窗口,用CMake構(gòu)建的工程,默認的都是帶控制臺窗口的,方便輸出調(diào)試信息。
如果到這里,你的程序的運行結(jié)果也跟圖2.11的類似,說明你的計算機已經(jīng)成功安裝了VTK。
圖2.11示例2.3.2_TestVTKInstall運行界面
2.3.3 CMake的幾個常用命令
為便于描述,我們把2.3.2節(jié)里的CMakeLists.txt的內(nèi)容再列出來,并標上行號:
?
?? 1:?cmake_minimum_required(VERSION 2.8)
?? 2:?project(TestVTKInstall)
?? 3:?find_package(VTK REQUIRED)
?? 4:?include(${VTK_USE_FILE})
?? 5:?add_executable(${PROJECT_NAME} TestVTKInstall.cpp)
?? 6:?target_link_libraries(${PROJECT_NAME} vtkRendering vtkCommon)
?
第1行用到的CMake命令cmake_minimum_required,該命令完整的形式為:
cmake_minimum_required(VERSION
major[.minor[.patch[.tweak]]]
[FATAL_ERROR])
命令說明:用于指定構(gòu)建工程時所需的CMake版本要求。參數(shù)VERSION,必須的關(guān)鍵字,且為大寫,(注:CMake的命令名是不區(qū)分大小寫的,為了統(tǒng)一描述,本書里所有的CMake命令都以小寫書寫,但是CMake命令的參數(shù)關(guān)鍵字,如VERSION,要求必須大寫。)第二個參數(shù)為指定CMake的版本號,CMake最新的版本是2.8.10,2012年11月7日發(fā)布。第三個參數(shù)為可選參數(shù),且為內(nèi)置的關(guān)鍵字“FATAL_ERROR”。如果構(gòu)建工程所用的CMake版本沒有達到要求,配置過程就會彈出圖2.12所示的錯誤提示信息,終止工程構(gòu)建過程。
圖2.12CMake構(gòu)建工程時的錯誤提示信息
第2行,project命令。完整語法格式為:
project(projectname[CXX] [C] [Java])
用該命令指定工程名稱,可指定工程支持的語言,支持語言的參數(shù)為可選。默認支持C\C++。該命令還隱含兩個CMake變量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR,在這個例子里就是TestVTKInstall_BINARY_DIR以及TestVTKInstall_SOURCE_DIR。同時CMake也預(yù)定義了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR變量,他們的值分別跟<projectname>_BINARY_DIR與<projectname>_SOURCE_DIR一致。為了統(tǒng)一起見,以后直接使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR分別表示工程的編譯路徑和源碼路徑,即這個例子里的“D:\Toolkits\VTK\Examples\2.3.2_TestVTKInstall\bin”和“D:\Toolkits\VTK\Examples\2.3.2_TestVTKInstall”,因為這樣即使修改了工程名稱,也不會影響這兩個變量。
project命令的第一個參數(shù)還隱含了另外一個變量:PROJECT_NAME,我們在第5、6行分別引用了這個變量:${PROJECT_NAME}。注意:CMake使用“${變量}”的形式來獲取該變量的值,也就是說,在這個例子里,${PROJECT_NAME}就相當(dāng)于工程名:“TestVTKInstall”。
第3行find_package命令,完整語法格式為:
find_package( <package>
[version]
[EXACT]
[QUIET]
[[REQUIRED|COMPONENTS][components...]]
[NO_POLICY_SCOPE])
find_package命令用于搜索并加載外部工程,隱含的變量為<package>_FOUND,用于標示是否搜索到所需的工程。參數(shù)[REQUIRED]表示所要搜索的外部工程對本工程來說是必須的,如果沒有搜索到,CMake會終止整個工程構(gòu)建過程。對VTK為例,find_package命令搜索的就是VTK的配置文件VTKConfig.cmake。我們在VTK附帶的例子目錄里的CMakeLists.txt有以下的CMake腳本語句:
?
(摘自VTK-5.10\Examples\Tutorial\Step1\Cxx\CMakeListx.txt):
find_package(VTKREQUIRED)
if(NOTVTK_USE_RENDERING)
message(FATAL_ERROR"Example ${PROJECT_NAME} requires VTK_USE_RENDERING.")
endif(NOTVTK_USE_RENDERING)
?
其實這四行腳本的作用跟第3行實現(xiàn)的功能是一模一樣的。關(guān)于find_package命令其他參數(shù)的意義可以參考CMake幫助文件(CMake安裝目錄下的doc文件夾下有文檔文件)。
第4行include命令,完整的語法為:
include( <file|module>
[OPTIONAL]
[RESULT_VARIABLE<VAR>]
[NO_POLICY_SCOPE])
指定載入一個文件或者模塊,如果指定的是模塊,那么將在CMAKE_MODULE_PATH中搜索這個模塊并載入,在本例中,指定的是VTK模塊,則會在CMAKE_MODULE_PATH中搜索VTK模塊并載入,變量CMAKE_MODULE_PATH指的是搜索CMake模塊的目錄,安裝安CMake以后,在CMake的安裝目錄下(本機是安裝在C:\Program Files (x86)\CMake 2.8\)可以找到CMake已經(jīng)定義的模塊,路徑為:C:\Program Files (x86)\CMake2.8\share\cmake-2.8\Modules,在該目錄下,有FindVTK.cmake文件。在這個文件里我們發(fā)現(xiàn)就有變量VTK_USE_FILE的說明信息。
VTK編譯目錄(D:/Toolkits/VTK/VTK-5.10-bin/)下的VTKConfig.cmake文件里我們可以看到變量VTK_USE_FILE定義為:
?
#The location of the UseVTK.cmake file.
SET(VTK_USE_FILE"D:/Toolkits/VTK/VTK-5.10-bin/UseVTK.cmake")
?
換言之,include (${VTK_USE_FILE})命令就是包含UseVTK.cmake文件。
第5行add_executable命令,完整語法為:
add_executable(<name>
[WIN32]
[MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1source2 ... sourceN)
定義這個工程會生成一個文件名為<name>的可執(zhí)行文件(本例中,我們使用變量${PROJECT_NAME}的值來指定即將生成的可執(zhí)行文件的名字),相關(guān)的源文件通過source1 source2 … sourceN列出(如果工程里有多個源文件,源文件之間用空格或者回車隔開),如果有多個源文件,也可以先用set命令定義一個變量,然后再用取變量值的操作符${}獲取到源文件列表,比如,某工程有source1.cpp、source2.cpp和source3.cpp三個文件,可以寫成:
set (projectname_srcsource1.cpp source2.cpp source3.cpp)
add_executable(projectname ${projectname_src})
與下行是等價的:
add_executable(projectname source1.cpp source2.cpp source3.cpp)
第6行target_link_libraries命令,完整語法為:
target_link_libraries(<target>
[item1[item2 [...]]]
[[debug|optimized|general]<item>] ...)
指定生成可執(zhí)行文件時需要鏈接哪些文件。參數(shù)<target>的名稱必須與第5行指定的<name>一致。本例中,我們同樣采用${PROJECT_NAME}來獲取需要的名稱,并且指定需要鏈接的函數(shù)庫為vtkRendering,在寫這些鏈接的函數(shù)庫時不需要帶“.lib”的后綴。
可能這個時候,你會問:為什么就知道要鏈接vtkRendering.lib這個文件呢?
TestVTKInstall.cpp文件里,我們使用到了vtkRenderWindow和vtkSmartPointer這個兩個類,查找這兩個類的頭文件所在的路徑,分別為:D:\Toolkits\VTK\VTK-5.10\Rendering和D:\Toolkits\VTK\VTK-5.10\Common。于是我們可以暫時做一個猜測:因為VTK里所有的類都是以“vtk”開頭,那VTK生成的函數(shù)庫應(yīng)該也以“vtk”開頭,而我們要用到的兩個類vtkRenderWindow和vtkSmartPointer的頭文件vtkRenderWindow.h和vtkSmartPointer.h又分別在文件夾Rendering和Common里,剛好在VTK編譯的目錄里我們能找到vtkRendering.lib和vtkCommon.lib這兩個文件,于是是否可以斷定我們要用到的兩個類vtkRenderWindow和vtkSmartPointer的接口就是分別定義在vtkRendering.lib和vtkCommon.lib里的?最后我們做出艱難的決定:在CMakeLists.txt的target_link_libraries里,要鏈接的函數(shù)庫就是vtkRendering和vtkCommon。隨著對VTK的深入了解,你會發(fā)現(xiàn)這種猜測是對的!
如果你好奇心比較強的話,在VTKConfig.cmake這個文件里(用記事本打開),可以找到以下語句:
SET(VTK_LIBRARIES"vtkCommon;vtkFiltering;vtkImaging;vtkGraphics;vtkGenericFiltering;vtkIO;vtkRendering;vtkVolumeRendering;vtkHybrid;vtkWidgets;vtkInfovis;vtkGeovis;vtkViews;vtkCharts")
上面的內(nèi)容我們已經(jīng)講過,set命令是用來定義某個變量的,而取變量的值我們可以用符號${},那是不是我只要在target_link_libraries的最后,不用一一列出所要鏈接的函數(shù)庫,而直接引用變量值:${VTK_LIBRARIES}來代替列出的“vtkRenderingvtkCommon”呢?答案也是可行的。
到此為止,就應(yīng)該能知道CMake常用的六個命令cmake_minimum_required、project、find_package、include、add_executable和target_link_libraries的“所以然”了,在這個CMakeLists.txt文件的六行代碼里,除了第1行關(guān)于CMake版本要求的可以省略之外,其他的5行都是必須的。
2.3.4 一個簡單的VTK工程
回頭再看看TestVTKInstall.cpp里的代碼,同樣標上行號:
?
| 示例2.3.2_TestVTKInstall |
??1:? #include"vtkRenderWindow.h"
??2:? #include"vtkSmartPointer.h"
??3:? int main()
??4:? {
??5:??vtkSmartPointer<vtkRenderWindow> renWin =vtkSmartPointer<vtkRenderWindow>::New();
??6:?? renWin->Render();
??7:??
??8:?? std::cin.get();
??9:?? return 0;
?10:? }
?
第1、2行,包含頭文件,因為要用到VTK里的vtkRenderWindow和vtkSmartPointer兩個類,所以包含相應(yīng)的頭文件。VTK對類的命名都是以小寫的vtk開頭,每個類的關(guān)鍵字的首字母大寫。
第5行,用智能指針定義了一個類型為vtkRenderWindow的對象,這是VTK的類實例化對象的基本方法。因為VTK里每個類的構(gòu)造函數(shù)都定義為保護成員,因此你不能夠用以下的語句來定義一個VTK對象:
vtkClassExampleinstance; //vtkClassExample這個類當(dāng)然是不存在的,只是說明問題而已
要不然會提示如下的錯誤:
errorC2248: vtkClassExample:: vtkClassExample: cannot access protected memberdeclared in class vtkClassExample
所以,要構(gòu)造VTK的對象可以用第5行的方法,或者用以下的方法:
vtkRenderWindow*renWin = vtkRenderWindow::New();
至于為什么,后面的內(nèi)容會讓你再“知其所以然”。
第6行,調(diào)用vtkRenderWindow里的方法顯示并渲染VTK窗口。
第8行,沒有其他特別的意義,只不過是讓程序暫停下來,等待接受用戶的輸入,目的是想讓你看看VTK窗口到底是長什么樣子,你可以把它注釋掉,看看它會不會一閃而過。
這個程序非常簡單,就一個VTK窗口,其他什么也沒有。但它確實是一個VTK的工程,至少使用了兩個VTK類,調(diào)用了一個VTK的方法。在后面的章節(jié)里,你還會經(jīng)常與這個窗口打交道。
2.4????????本章小結(jié)
這章一開始我們?yōu)榘惭bVTK作了非常充分的準備工作,了解了在編譯安裝VTK之前需要先安裝哪些軟件。然后,我們一步一步地演示了如何編譯VTK,這個過程還是非常簡單的。最后,安裝完VTK,我們通過一個非常簡單的VTK小程序——顯示一個VTK窗口,來測試VTK是否成功安裝。通過這個小程序,我們學(xué)習(xí)了CMakeLists.txt腳本的寫法,并掌握了6個CMake命令,分別是:cmake_minimum_required、project、find_package、include、add_executable和target_link_libraries。
2.5????????本章參考資料
[1]靜態(tài)編譯與動態(tài)編譯:http://cau99.blog.51cto.com/1855224/358797
[2]CMake介紹:http://en.wikipedia.org/wiki/CMake
[3]CMake實踐:http://sewm.pku.edu.cn/src/paradise/reference/CMake%20Practice.pdf
==========歡迎轉(zhuǎn)載,轉(zhuǎn)載時請保留該聲明信息==========
版權(quán)歸@東靈工作室所有,更多信息請訪問東靈工作室
教程系列導(dǎo)航:http://blog.csdn.net/www_doling_net/article/details/8763686
================================================
總結(jié)
- 上一篇: Linux下VTK、ITK的安装及运行
- 下一篇: Hepatology | 朱黎琴/于吉洋