阅读更多
前言:
虽然写了这么一大堆,实际过程很简单,大家耐心看完,绝对能成功。我已经在我的办公电脑和我的影像工作站上,都成功实现了。(简单文字版,请看这篇《DCMTK3.6.0(MD支持库)安装说明-无图版》)
DCMTk3.5.4安装类似于下面,但是CMake生成的时候,可以直接界面上修改,因为3.5.4和3.6.0的CMakeLists.txt很多地方已经不一样了,之间的区别可以参考这篇文章《DCMTK3.5.4与3.6.0版本的区别》
柳北风儿
[email protected]
2012-06-07
一、运行环境:WIN7 32bit + VisualStudio2008 + dcmtk3.6.0 + Cmake2.8.8
或者 WIN7 64bit
二、准备工作:
1)MD/MT的知识储备:
/MT和/MTd表示采用多线程CRT库的静态lib版本。该选项会在编译时将运行时库以静态lib的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的“Invalid Address specified to RtlValidateHeap”问题。另外托管C++和CLI中不再支持/MT和/MTd选项。
/MD和/MDd表示采用多线程CRT库的动态dll版本,会使应用程序使用运行时库特定版本的多线程DLL。链接时将按照传统VC链接dll的方式将运行时库MSVCRxx.DLL的导入库MSVCRT.lib链接,在运行时要求安装了相应版本的VC运行时库可再发行组件包(当然把这些运行时库dll放在应用程序目录下也是可以的)。 因/MD和/MDd方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以MD方式运作时,其内部会采用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。
结论:/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要采用了。
2)下载软件:
①dcmtk-3.6.0 .zip;
②dcmtk-3.6.0-win32-i386-support_MD.zip(注意,要下载***support_MD的压缩文件,而不要下载上面单独列出来的支持库)。我选择的MD,因为我的软件项目都是基于MD的运行时库。(您也可以选择dcmtk-3.6.0-win32-i386-support_MT.zip,如果您的项目是基于MT。通过项目属性的C/C++->code generation 可以更改运行时库)将这些压缩文件解压缩到硬盘上一个单独的文件夹里,我的解压缩目录是D:\DCMTK\。
③从cmake官方网站下载cmake的安装文件,我下载的是cmake-2.8.8-win32-x86.exe。将其安装到计算机任意目录下。
④dcmtk-3.6.0-html-help.zip,dcmtk html版本帮助文档,CHM版本暂时还未出。
三、安装过程
1. 将支持库中的相应lib文件,include文件,bin文件拷贝到VS2008安装目录的相应文件夹下。
A.在解压得到的支持库的文件夹下搜索_d.lib文件(xxx_d.lib为DEBUG版本的支持库,xxx_o.lib为RELEASE版本支持库),应该会得到7个结果,将这些文件复制到一个单独的文件夹下,并把它们的名字中的_d去掉,例如将zlib_d.lib重命名为zlib.lib。将重命名后的文件拷贝至VS2008安装目录下的lib文件夹下,在我的win7 32bit电脑上是C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\。(win7 64bit操作系统是C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\)
B.
在解压得到的支持库的文件夹下搜索include,应该得到5个文件夹,将这些文件夹复制到C:\Program Files\Microsoft Visual Studio 9.0\VC\下,选择合并文件夹,也就是将include文件夹下的内容全部复制到C:\Program Files\Microsoft Visual Studio 9.0\VC\include\目录下。(win7 64bit操作系统是C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ include\)
C.将D:\DCMTK\dcmtk-3.6.0-win32-i386-support_MD\openssl-1.0.0c\bin下的五个文件复制到C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\下。(win7 64bit操作系统是C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ bin\)
2. CMAKE编译
A.
修改DCMTK源码的CMake配置属性,CMake将要把DCMTK源码生成VS2008项目:
打开D:\DCMTK\dcmtk-3.6.0\dcmtk-3.6.0\CMakeLists.txt
1、
将/MT修改成/MD, /MTd修改成/MDd(因为我是Visual Studio 9 2008,所以只修改绿色的地方,为了安全和方便,你可以把CMakeLists.txt里面的/MT、 /MTd都替换成/MD、 /MDd).
如下图
(点击图片可以看高清图)
2、
修改DCMTK支持库的开关属性。将前面五个支持项(DCMTK_WITH_TIFF、DCMTK_WITH_PNG、DCMTK_WITH_XML、DCMTK_WITH_ZLIB、DCMTK_WITH_OPENSSL)的开关都设置成ON。
如下图
(点击图片可以看高清图)
修改后
小注:实际上面两步骤本来是在CMake程序界面上直接可以修改的,奈何CMake对DCMTK3.6.0支持的并不是很好,界面改了CMake属性,生成的VS项目实际并没有改,你可以自己查看后面D:\DCMTK\dcmtk-bin里的VS项目dcmDump的项目属性-〉C/C++-〉Code Generation,里面仍然会是MTd,这样就导致后面建立Qt的MDd项目小例子,编译总是出错。于是只好手动修改CMakeLists.txt了,其实并不影响生成VC项目,反而更方便。这是影响我问题的关键,我是在DCMTK官方论坛里看到的解决方法。
FAQ #26: Compilation of DCMTK-based program fails w/ LNK2005,请注意最后一段的Note。
B. 打开安装好的CMAKE-gui程序。关闭所有跟VS有关的程序。在where is the source code里,选择你的dcmtk源代码的位置,
我的源代码位置是D:\DCMTK\dcmtk-3.6.0\ dcmtk-3.6.0。在where to build the binaries下选择你想存放build结果的文件夹,我新建
了一个D:\DCMTK\dcmtk-bin 的文件夹。 C. 点击Configure,选择编译环境。我的win7 32bit电脑上装的VS2008,因此我选择的Visual Studio 9 2008,(win7 64bit
也选择这个Visual Studio 9 2008,不用选择VS2008 64bit,否则出错)点击finish。等待configure完成。这中间会出现***not found
的信息,忽略它们。 D. 之后点击Generate。这时候CMake使命也就完成了,可以关闭了。
如下图
(点击图片可以看高清图)
3. VS2008编译
这时在D:\DCMTK\dcmtk-bin下会多出来很多文件夹和文件。用VS2008打开其中的sln文件。在一个solution下会有很多个project。
A.
点击Build->Batch Build,选择ALL_BUILD的debug版,点击右边的Build。耐心等待。会有很多个warning,应该是由字符编码不统一引起的。最后会看到76个编译 成功,0个失败。
B.
之后,再选择Build->Batch Build,这次选择INSTALL的debug版本,点击右边的Build。最后会显示1个工程编译成功,这时在你选择的安装目录下(默认是C:\Program Files\DCMTK)就会有lib,bin,include,etc,share文件夹,里面就是之后写程序做医学图像处理所需要的库文件了!
如下图
(点击图片可以看高清图)
四、测试例子
#include "testa.h"
#include
#include
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dctk.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TestA w;
w.show();
DcmFileFormat fileformat;
OFCondition oc = fileformat.loadFile("111.dcm");
if(oc.good()){
OFString patientName;
if(fileformat.getDataset()->findAndGetOFString(DCM_PatientName, patientName).good())
{
qDebug()<<"Patient Name:"<
1、配置项目属性
A. 新建一个Qt application,把以上源代码复制粘贴进main.cpp去。 B. 右键单击工程名,选择属性(properties),在Configuration Properties->C/C++->General下,
Additional
Include Directories里加入上一步编译出来的include文件夹,我的Win7 32bit电脑上是
C:\Program Files\DCMTK\include,
这一步是为了让程序能够找到头文件。(Win7 64bit 路径是:
C:\Program Files (x86)\ DCMTK\include)
C. C/C++->code generation里,Runtime Library 选择/MDd,这一步是要和之前CMAKE的编译选项一致。
(我的Qt项目默认就是/MDd) D. Linker->General里,Additional Library Directories里填写上一步编译出来的lib文件夹,我的Win7 32bit
电脑上是C:\Program Files\DCMTK\lib,这一步是为了让程序能够找到之前编译好的lib文件。(Win7 64bit 路径是:
C:\Program Files (x86)\ DCMTK\lib) E. Linker->Input里,在Additional Dependencies 里依次加上
wsock32.lib netapi32.lib ofstd.lib oflog.lib dcmdata.lib zlib.lib
这一步是加入具体我们程序需要的lib文件。网上很多的帖子中,都没有提到oflog.lib这个文件,
可能是由于旧的版本中
并没有使用到这个文件。但是对于3.6.0版,这个lib文件是必需的。
我们例子中只需要如上几个Lib,如果还需要其他
dcmtk 的lib,请遵守以下引入顺序。
F. Apply ,ok,编译工程,运行,命令行应该输出Patient Name:he ying hou 。
附件上有一个DICOM的图像 111.dcm
参考文章:
1、 FAQ #26: Compilation of DCMTK-based program fails w/ LNK2005
2、 DCMTK3.6.0 (MT支持库)安装 完整说明
- 大小: 12.8 KB
- 大小: 15 KB
- 大小: 22.8 KB
- 大小: 90.9 KB
- 大小: 49 KB
- 大小: 49 KB
- 大小: 81.5 KB
- 大小: 56.8 KB
- 大小: 52.7 KB
- 111.DCM.rar (228 KB)
- 下载次数: 104