花了一個禮拜,終於在VC++2008 MFC 應用程序中完成了首個基於DCMTK354的首個程序ECHOSCUWIN32,現將過程記錄下來,便於日後查閱,同時也提供給那些有幸看到此博文而對他們又有幫助的訪客!
如果你在 VS2008 中編譯 DCMTK354,並且創建自己的基於DCMTK354靜態庫的 VC++ MFC 應用是遇到問題,或許下面的咨詢會對你有幫助!
在此感謝來至寶島台灣的同行 Chinson,他的博文 “使用 DCMTK 函式庫 for Visual C++ 2005”是我受益非淺,同時也感謝對我所咨詢問題的不辭解答!
Chinson 的博客空間 http://blog.chinson.idv.tw
同時感謝來至 DCMTK 論壇的各位DCMTK庫的創造者和維護者們,DCMTK的相關論題地址 http://forum.dcmtk.org/viewtopic.php?t=1881&highlight=2008
最後,還是不得不說,最終解決問題的還是來至微軟的MSDN,MSDN相關論題地址 http://msdn.microsoft.com/en-us/library/70abkas3.aspx
-------------------------------------------------------------------
以下是對Chinson博文 “使用 DCMTK 函式庫 for Visual C++ 2005”及相關文章的引用,版權歸作者所有:
Wednesday, July 23, 2008
使用 DCMTK 函式庫 for Visual C++ 2005
這篇文章假設讀者已經透過 DCMTK 的編譯及設定 for Visual C++ 2005 一文編譯好適用於 VC++2005的函式庫。
創建一個新專案後,要如何跟我們已經設定好的 DCMTK 函式庫做連結呢?
1. 將 DCMTK 的 include 目錄設定給新專案
(1) 在方案總管中點選新專案
(2) 從主選單中選擇 "專案" - "屬性"
(3) 從對話盒左側選擇 "組態屬性" - "C/C++"
(4) 在右側的 "其他 Include 目錄" 屬性中,填入 "C:\DCMTK\include"
2. 將 DCMTK 的 lib 目錄設定給新專案
(1) 從屬性對話盒左側選擇 "組態屬性" - "連結器"
(2) 在右側的 "其他程式庫目錄" 屬性中,填入 "C:\DCMTK\lib"
3. 在新專案中指定引用的相關程式庫檔案
(1) 從屬性對話盒左側選擇 "組態屬性" - "連結器" - "輸入"
(2) 在右側的 "其他相依性" 屬性中填入以下字串,注意各程式庫檔的順序必須要正確。
"netapi32.lib wsock32.lib ofstd.lib dcmdata.lib dcmimgle.lib dcmimage.lib ijg8.lib ijg12.lib ijg16.lib dcmjpeg.lib dcmnet.lib dcmdsig.lib dcmsr.lib dcmtls.lib dcmpstat.lib dcmwlm.lib dcmqrdb.lib dcmtkeay.lib dcmtkssl.lib iconv.lib libtiff.lib libpng.lib libxml2.lib zlib.lib"
4. 指定新專案的執行階段程式庫(必須與DCMTK編譯時的設定相同,預設為 /MT /MTd)
(1) 從屬性對話盒左側選擇 "組態屬性" - "一般"
(2) 在右側的 "MFC的使用" 選擇 "使用標準的視窗程式庫"
(3) 從屬性對話盒左側選擇 "組態屬性" - "C/C++" - "程式碼產生"
(4) 在右側的 "執行階段程式庫" 選擇 "多執行緒(/MT)" (for release 組態) 或 "多緒行緒偵錯(/MTd)" (for debug 組態)
透過上述的設定,應該就可以在新專案中使用 DCMTK 了。
Posted by Chinson at 5:08 PM 0 comments Links to this post
Labels: IT note
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 定義來決定。
Wednesday, July 23, 2008
使用 DCMTK 函式庫 for Visual C++ 2005
這篇文章假設讀者已經透過 DCMTK 的編譯及設定 for Visual C++ 2005 一文編譯好適用於 VC++2005的函式庫。
創建一個新專案後,要如何跟我們已經設定好的 DCMTK 函式庫做連結呢?
1. 將 DCMTK 的 include 目錄設定給新專案
(1) 在方案總管中點選新專案
(2) 從主選單中選擇 "專案" - "屬性"
(3) 從對話盒左側選擇 "組態屬性" - "C/C++"
(4) 在右側的 "其他 Include 目錄" 屬性中,填入 "C:\DCMTK\include"
2. 將 DCMTK 的 lib 目錄設定給新專案
(1) 從屬性對話盒左側選擇 "組態屬性" - "連結器"
(2) 在右側的 "其他程式庫目錄" 屬性中,填入 "C:\DCMTK\lib"
3. 在新專案中指定引用的相關程式庫檔案
(1) 從屬性對話盒左側選擇 "組態屬性" - "連結器" - "輸入"
(2) 在右側的 "其他相依性" 屬性中填入以下字串,注意各程式庫檔的順序必須要正確。
"netapi32.lib wsock32.lib ofstd.lib dcmdata.lib dcmimgle.lib dcmimage.lib ijg8.lib ijg12.lib ijg16.lib dcmjpeg.lib dcmnet.lib dcmdsig.lib dcmsr.lib dcmtls.lib dcmpstat.lib dcmwlm.lib dcmqrdb.lib dcmtkeay.lib dcmtkssl.lib iconv.lib libtiff.lib libpng.lib libxml2.lib zlib.lib"
4. 指定新專案的執行階段程式庫(必須與DCMTK編譯時的設定相同,預設為 /MT /MTd)
(1) 從屬性對話盒左側選擇 "組態屬性" - "一般"
(2) 在右側的 "MFC的使用" 選擇 "使用標準的視窗程式庫"
(3) 從屬性對話盒左側選擇 "組態屬性" - "C/C++" - "程式碼產生"
(4) 在右側的 "執行階段程式庫" 選擇 "多執行緒(/MT)" (for release 組態) 或 "多緒行緒偵錯(/MTd)" (for debug 組態)
透過上述的設定,應該就可以在新專案中使用 DCMTK 了。
通過以上博文,最終你可能任然在VS2008中的不到VC++ 2008 MFC的最終程序,這裡可能還有一點錯誤:
關於SBYTE 的重復定義 錯誤,參見討論http://forum.dcmtk.org/viewtopic.php?t=647&highlight=sbyte
其中大概意思即是直接注銷 DCMTK354中關於SBYTE的定義,因為在DCMTK354中此定義沒有被使用過。
關於 類似如下
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _malloc already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _free already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit already defined in msvcrtd.lib(MSVCRTD.dll)
錯誤的相關討論 地址:
http://forum.dcmtk.org/viewtopic.php?t=1881&highlight=2008
最後此問題的解決方法還是來至與MSDNhttp://msdn.microsoft.com/en-us/library/70abkas3.aspx中的如下解釋
The /FORCE option tells the linker to create a valid .exe file or DLL even if a symbol is referenced but not defined or is multiply defined.
The /FORCE option can take an optional argument:
Use /FORCE:MULTIPLE to create an output file whether or not LINK finds more than one definition for a symbol.
Use /FORCE:UNRESOLVED to create an output file whether or not LINK finds an undefined symbol. /FORCE:UNRESOLVED is ignored if the entry point symbol is unresolved.
/FORCE with no arguments implies both multiple and unresolved.
A file created with this option may not run as expected. The linker will not link incrementally when the /FORCE option is specified.
If a module is compiled with /clr, /FORCE will not create an image.
To set this linker option in the Visual Studio development environment
Open the project's Property Pages dialog box. For details, see Setting Visual C++ Project Properties.
Click the Linker folder.
Click the Command Line property page.
Type the option into the Additional Options box.
大概意識就是在 附加選項輸入框中輸入此二行即可:
/clr
/FORCE
至此,基於DCMTK354靜態連接庫的VC++2008 MFC 應用程序即可成功創建。