Tuesday, July 22, 2008

DCMTK 的編譯及設定 for Visual C++ 2005

DCMTK 是一個開放程式碼的 DICOM Toolkit,提供讀取 DICOM 影像及進行傳輸通訊的函式庫。
我的博士論文中,有關電腦斷層影像的讀取程式,就是使用 DCMTK 這個函式庫。

先前編譯的 DCMTK 版本是 3.5.3 ,但是最近研究室學弟使用這個函式庫在讀取新資料時,頻頻出現問題。問題的可能原因是高榮更新了影像軟體,也許新版本的 DICOM 格式有更新,造成舊的讀取程式不相容。目前最新的 DCMTK 版本是 3.5.4 ,雖然不確定此版本是不是可以使用在新資料上,但總是試試無妨。

DCMTK 的程式碼相當龐大,而且適用於 Window 及 Linux 平台,因此在編讀前必須經過一翻設定。以下主要簡介如何在 Windows 下的 Visual C++ 2005 進行 DCMTK 函式庫的設定及編譯。

要下載的檔案︰
DCMTK 3.5.4 source code and documentation dcmtk-3.5.4.zip
Pre-compiled libraries for Windows 9x/Me/NT/2000/XP dcmtk-3.5.4-win32-i386-support.zip
CMake cmake-2.6.0-win32-x86.zip

1. 解壓縮檔案
(1) 將 dcmtk-3.5.4.zip 解壓縮在 C:\DCMTK\ (會自動新建子目錄 dcmtk-3.5.4)
(2) 將 dcmtk-3.5.4-win32-i386-support.zip 解壓縮在 C:\DCMTK\
(3) 將 cmake-2.6.0-win32-x86.zip 解壓縮在 C:\DCMTK\

2. 使用 CMake 產生 Visual C++ 2005 所需要的檔案
(1) 進入 C:\DCMTK\cmake-2.6.0-win32-x86\bin\ 執行 CMakeSetup.exe
(2) 在 "Where is the source code:" 填入 C:\DCMTK\dcmtk-3.5.4
(3) 在 "Where to build the binary:" 填入 C:\DCMTK\dcmtk-3.5.4
(4) 按一下 "Configure" 按鈕,並在出現的對話盒選 "Visual Studio 8 2005" ,按下 OK
(5) 當中間出現變數時,可以發現 CMake 已經自動搜尋到 libxml, libpng,.. 等的所在目錄,在此可以根據需求開啟要連結的函式庫。要開啟特定的函式庫只要把原本的 OFF 改成 ON 即可。
(6) 將 "Show Advanced Values" 打勾
(7) 找到 "LIBARY_OUTPUT_PATH" ,將其後的變數設成 C:\DCMTK\lib\
(8) 找到 "EXECUTABLE_OUTPUT_PATH" ,將其後的變數設成 C:\DCMTK\bin\
(9) 再按一下 "Configure" 按鈕
(10) 最後按下 "OK" 按鈕結束

3. 使用 Visual C++ 2005 編譯
(1) 進入 C:\DCMTK\dcmtk-3.5.4 目錄,並在 dcmtk.sln 檔案點兩下(系統要裝好 VC++ 2005 喔)
(2) 從主選單中選 "建置" - "批次建置"
(3) 從開啟之對話盒中勾選 "ALL_BUILD" 的 4 項建置方案,並按下 "重建"
(4) 進入目錄 C:\DCMTK\lib ,其下會有 4 個子目錄,分別是上述 4 項建置方案的輸出。

4. 整理 DCMTK 及其他外部函式庫的目錄(這個步驟是建議的選項)
(1) 用檔案總管搜尋 C:\DCMTK\dcmtk-3.5.4 下的所有 "include" 目錄,將其全部複製到 C:\DCMTK\ 目錄下。(連結 DCMTK 函式庫時,必要的2個部份是函式庫的 lib 檔以及相關的 .h 檔。lib 檔已經在前述的步驟中建立在 C:\DCMTK\lib 目錄內,這裡是把相關的 .h 檔集中放置在 C:\DCMTK\include 目錄內,以方面其他專案連結。
(2) 把 C:\DCMTK\libpng-1.2.8, C:\DCMTK\libxml2-2.6.26, C:\DCMTK\openssl-0.9.8a, C:\DCMTK\tiff-3.7.4, C:\DCMTK\zlib-1.2.3 各目錄下的 include 子目錄內資料複製到 C:\DCMTK\include 內。將 lib 子目錄內資料 *_d.lib 複製到 C:\DCMTK\lib\debug 目錄,*_o.lib 複製到 C:\DCMTK\lib\release 目錄,並把檔名中的 _d 及 _o 字元移除。


透過上述的流程,即可建立可用於 Visual C++ 2005 環境的 DCMTK 函式庫。
關於在新專案中使用 DCMTK 函式庫的方法等之後再補上來..

注意事項︰
1. DCMTK 的設定中,預設是採用 "Multithreaded" runtime options (/MT and /MTd) 的設定,因此若新專案要使用上述方法編譯之函式庫,則新專案的 runtime options 設定必須一致。
2. 在 VC 中,fstream 的用法有2種,一為 一為內建於 std 中的 。DCMTK預設使用 std 的函式庫,因此使用的新專案也必須要一致。是否使用 std 的 fstream 可透過 C:\DCMTK\dcmtk-3.5.4\config\include\dcmtk\config\cfwin32.h 檔案中的 USE_STD_CXX_INCLUDES 定義來決定。

5 comments:

falconsyc said...
This comment has been removed by the author.
Chinson said...

To falconsyc:

我想可能是 CMake 步驟是否沒設定好。是哪些檔案呢?libxml, libpng,.. 等等外加的函式庫,相關路徑都要在 CMake 中做正確的設定。

falconsyc said...
This comment has been removed by the author.
falconsyc said...

謝謝,問題已解決,已經開使重建,請問一下是不是要重建一段時間?

falconsyc said...

重建完成後,
錯誤的部份:都是以定義過了
警告的部份:有不一致的DLL連結
預設的程式庫 'LIBCMTD' 與其他使用的程式庫衝突,請使用/NODEFAULTLIB:library
檔案含有無法在目前字碼頁 (950) 中表示的字元。請以 Unicode 格式儲存檔案以防止資料遺失

這樣會有影嗎?該如何解決?