DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建

DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建

写在前面

最近的课堂作业接触到了关于医学图像格式Dicom的一些开发,在经过将近一个学期硬着头皮上的学习后,最终,在这里记录一些过程中遇到的问题。

由于在学习过程中,互联网上找到的资料多是关于DCMTK 3.6.0的安装准备,大都有一些过时,且有效信息分布得比较散乱,所以这篇文章先简单记录一下DCMTK 3.6.2开发环境的搭建,以备日后不时之需。


知识准备

DCMTK

DCMTK是由德国offis公司提供的开源项目,利用C++实现,经过十多年的开发和维护,已经基本实现了Dicom协议的所有内容,且提供了所有源代码、支持库和帮助文档,自然就成了本次课程项目的不二之选。

MT or MD?

作者柳北风儿在一篇关于DCMTK 3.6.0编译的博文中提到

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在非必要时最好也不要采用了。


下载软件

DCMTK源代码以及相应版本的MD支持库

DCMTK3.6.2的源代码和已经编译完成的可执行文件都可以在其官网上直接下载。 
需要注意的是在下载MD支持库时,要正确选择对应的操作系统版本以及Visual Studio版本,在这里我们选择下载: 
dcmtk-3.6.2-win64-support_MD-msvc-15.0.zip 
Pre-compiled libraries for Visual Studio 2017 (MSVC 15.0), 64 bit, with “MD” option

CMake

对DCMTK源代码的生成需要用到Cmake。CMake版本的选择可能没有那么多讲究,本次直接选择了可以下载到的最新稳定版本3.10.0,但理论上更新的版本也可行。 
还是要多嘴说一句,CMake的源码在本项目中没有用,下载时请选择Binary Distributions进行下载,同样也要选择对应操作系统的版本下载。


正式开工

使用CMake生成DCMTK工程文件

  1. 解压下载的DCMTK源码包和支持库包
  2. 打开CMake 选择源代码路径和将要生成的代码路径
  3. 点击左下角Configure,在弹出对话框中选择对应的MS版本后Finish确认 
    cmake工程设置
  4. 点完可能要跑很久,第一次要check很多东西,在跑完以后列表里应该是这样一片红。 
    cmake列表一片红
  5. 上图中的黄色方框内,就是我们刚才下载的支持库要设置的地方了。CMake没有自动识别到路径,我们需要手动设置一下。 
    下载的支持库目录结构如下: 
    支持库目录结构
  6. 将这些支持库路径全部设置完成之后,应该如下图所示(每个人支持库存放路径有所不同,图中路径仅供参考,实际以自己的为准): 
    支持库配置完毕
  7. 在配置中,将配置过路径的这些项目全部勾选,并将DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS取消勾选(很关键)。 
    这里写图片描述
  8. 此时再次点击Configure,短暂的读条之后,列表应该全都变成白色,检查先前做过的改动是否依然保留,如果路径和勾选项依然保留,说明设置已经成功,点击Generate就可以生成工程文件了。 
    改动保留,点击生成
  9. 至此,CMake上的工作就全部结束了,可以关闭CMake进行后续操作。

打开得到的DCMTK工程文件进行批生成

  1. (非常重要)由于CMake生成的工程配置文件中引用了错误的文件名,必须对产生的工程文件进行修改:打开DCMTK工程目录,打开并修改./dcmnet/apps/cmake_install.cmake文件,全文搜索openssl。便会发现此段引用了两个不存在的文件名dcmtkeay.dlldcmtkssl.dll,将其分别修改成先前下载的支持库中 
    ./openssl-1.1.0f/bin/dcmtkcrypto_d-1_1-x64.dll和 
    ./openssl-1.1.0f/bin/dcmtkssl_d-1_1-x64.dll 
    即可(Release版本选择没有_d后缀的文件进行修改),修改后保存关闭。
  2. 使用管理员权限用Visual Studio打开得到的DCMTK工程解决方案(DCMTK.sln)
  3. 菜单栏选择生成(B)–>批生成(T)…
  4. 在弹出对话框中勾选Debug配置的ALL_BUILD项目(若要生成Release版本的文件,此处和后续步骤都选择Release配置即可),点击生成。 
    生成
    事实证明,这一步会跑非常久(图转网侵删) 
    comic
  5. 当你得到类似如下提示,说明这一步已经完成了 
    成功95个
  6. 重复第3步,但是多勾选一个Debug配置下的INSTALL项目(Release环境选Release),然后点生成。 
    生成INSTALL
  7. 如果没有报错,那恭喜,DCMTK 3.6.2已经编译成功了,

编写示例程序进行测试

工程设置

新建一个VC++空项目,设置工程解决方案配置为debug,解决方案平台为x64 ,添加源文件main.cpp。

进入菜单栏项目(P)–>YOUR_PROJECT_NAME_属性(注意修改的都是debug下的x64的配置,如果换成release要重新设置成release方案下的配置)。

左侧C/C++–>常规,右侧附加包含目录,设置为 
C:\Program Files\DCMTK\include(默认位置)。

左侧链接器–>常规,右侧附加库目录,设置为 
C:\Program Files\DCMTK\lib 
你下载并解压的支持库目录\zlib-1.2.11\lib

左侧链接器–>输入,右侧附加依赖项,设置为 
Iphlpapi.lib 
ws2_32.lib 
wsock32.lib 
netapi32.lib 
ofstd.lib 
oflog.lib 
dcmdata.lib 
dcmdsig.lib 
dcmnet.lib 
dcmsr.lib 
dcmimgle.lib 
dcmqrdb.lib 
dcmtls.lib 
dcmwlm.lib 
dcmpstat.lib 
dcmjpls.lib 
dcmjpeg.lib 
dcmimage.lib 
charls.lib 
ijg8.lib 
ijg12.lib 
ijg16.lib 
i2d.lib 
zlib_d.lib(Release版本删除_d) 

附一张lib依赖关系图,之后遇到具体问题不用全数添加,选择需要的以及其依赖即可 
dcmlibs

示例代码

//filename: main.cpp
#include "dcmtk\config\osconfig.h"
#include "dcmtk\dcmdata\dctk.h"
#include <iostream>

void main() {
    DcmFileFormat *myFileFormat = new DcmFileFormat;
    OFCondition cond = myFileFormat->loadFile("c:/111.dcm");
    if (cond.good()){
        OFString patientName;
        if (myFileFormat->getDataset()->findAndGetOFString(DCM_PatientName, patientName).good()) 
            std::cout << "Patient Name: " << patientName << "\nTest successed.\n";
        else std::cout << "No Patient Name Data!\n";
    }
    else std::cout << "Error occurs when opening file, check path or filename.\n";
    system("pause");
}

最后附上测试用到的dicom格式图片。提取密码: cw3q

如果能够正确显示Patient Name参数,那么恭喜,DCMTK库已经完全正确地安装好了,可以进行下一步的开发工作了!

猜你喜欢

转载自blog.csdn.net/a8039974/article/details/108341548