花了一个礼拜,终于在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 应用程序即可成功创建。

DCMTK354之VC++ 2008 MFC应用程序配置完整过程的更多相关文章

  1. MFC应用程序配置不正确解决方案(manifest对依赖的强文件名,WinSxs是windows XP以上版本提供的非托管并行缓存)

    [现象] 对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提 ...

  2. Hadoop完全分布式安装配置完整过程

    一. 硬件.软件准备 1. 硬件设备 为了方便学习Hadoop,我采用了云服务器来配置Hadoop集群.集群使用三个节点,一个阿里云节点.一个腾讯云节点.一个华为云节点,其中阿里云和腾讯云都是通过使用 ...

  3. mysql-8.0解压缩版安装配置完整过程

    https://www.cnblogs.com/xiongzaiqiren/p/8970203.html

  4. iOS程序的启动过程-UIWindow

    UIApplicationMain main函数中执行了一个UIApplicationMain这个函数 int UIApplicationMain(int argc, char *argv[], NS ...

  5. VC++6.0和VS2005在编写MFC应用程序时,操作方面的差异

    VC++6.0和VS2005在编写MFC应用程序时,操作方面的差异 一直用VC++6.0,对VS2005不太了解,下面简单的熟悉一下VS2005的一下功能,总结一下VS2005在编写MFC时候的应用. ...

  6. MFC VC++ 根据文件名获取程序的Pid

    环境:PC Win7 VS VC++ .MFC 使用,输入文件名即可获取程序的pid,进而可以对程序进行操作,比如关闭Porcess等. 头文件: #include <TlHelp32.h> ...

  7. VC++MFC对话框程序中给对话添加背景图片

    VC对话框怎么显示背景图片呢.在MFC中实现背景图片,不像C#应用程序那么简单.今天就和朋友们说说如何在VC界面中设置背景图片 ^_^   工具/原料 Visual C++ 2010 方法一:用Pic ...

  8. 命令行下的C++程序转换成VC的MFC程序需要注意的问题

    在将命令行下的C++程序转换成MFC窗口程序时一般会提示下面这种错误: fatal error C1010: unexpected end of file while looking for prec ...

  9. 害人的VS2008,manifest导致“应用程序配置不正确,应用程序未能启动”

    在VC++2008的项目中,如何显示地指定要使用的C++库的版本? 开发环境:VS2008 SP1 + Win2003 SP2         因为我的VS2008安装了SP1补丁,所以有了9.0.3 ...

随机推荐

  1. [BZOJ 1797][AHOI2009]最小割(最小割关键边的判断)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1797 分析: 在残余网络中看: 对于第1问: 1.首先这个边必须是满流 2.其次这个边 ...

  2. 线段树好题(2004集训队林涛PPT中的3题)

    1.snake:主要是要意识到全局的可能连法只有一种= =(略坑,题目的最小长度是唬人的……),所以关键就是能否构造出符合题意的图,可以考虑搜索解决,搜出一个就OK了,但是会发现那些满足条件中线段在非 ...

  3. DOM(十)使用DOM设置单选按钮、复选框、下拉菜单

    1.设置单选按钮 单选按钮在表单中即<input type="radio" />它是一组供用户选择的对象,但每次只能选一个.每一个都有checked属性,当一项选择为t ...

  4. 第二章:Javascript词法结构

    编程语言的词法结构是一套基础性的规则,用来描述你如何编写这门语言.作为语法的基础,它规定了变量名是怎么样的,如何写注释,以及语句之间是如何区分的.本节用很短的篇幅来介绍javascript的词法结构. ...

  5. AngularJS开发指南15:AngularJS的创建服务,将服务注入到控制器,管理服务依赖详解

    创建服务 虽然AngularJS提供了很多有用的服务,但是如果你要创建一个很棒的应用,你可能还是要写自己的服务.你可以通过在模块中注册一个服务工厂函数,或者通过Module#factory api或者 ...

  6. C#的默认访问修饰符

    Classes and structs that are not nested within other classes or structs can be either public or inte ...

  7. [Linux主机] 优化你的php-fpm(php5.3+)让你的网站跑得更快

    从php5.3以后php自带了php-fpm不是和php5.2一样以插件的方式存在了.这给我们带来一个好处502没有那么容易出现了坛子里用linux的绝大多数应该还是在用小军的lnmp的那个包,但是配 ...

  8. linux oracle磁盘满了

    最近,查看我们一台linux服务器,发现硬盘空间都已经使用了95%,很是疑惑啊,怎么回事那?难道是数据库文件太大了? Filesystem            Size  Used Avail Us ...

  9. Maven 教程

    Maven 教程 序:几次对Maven 的学习,都因为各种原因 而中途切断了,再一次学习的时候,又不得不重新开始,结果发现 又不记得步骤 又找不到对应的文档.别人写的再好,终究比不过自己亲手实践的得出 ...

  10. GPUImage学习

    1.GLProgram--加载vertex和fragment的shader. 好处是完全将shader模块的加载过程独立出来. 学习:每个函数处理一件事,且函数的粒度刚好 在glLinkProgram ...