最近项目中有需求需要对DICOM影像进行处理, 因此需要使用到开源库DCMTK。编译与安装遇到了一些坑这里总结以下。
https://dicom.offis.de/dcmtk.php.en
下载后解压到D:\DCMTK\dcmtk-3.6.6目录下
网上上看了许多blog关于编译的说法众说纷纭,最后还是参考了官方的文档中的INSTALL相关说明
下载后解压到D:\DCMTK\dcmtk-3.6.6-html-help
编译x64的选带Win64的,编译x86的选win32的。
这里编译的是x64的项目因此选择红色的 dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8.zip
另外带icu的版本好像是支持unicode相关,这里没有用到。
下载后解压到 D:DCMTK\dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8
MD的意思是使用表示动态连接msvcrt.dll (debug版连接msvcrtd.dll)这样构建的静态库较小也不需要在多个项目中重复连接入libmcrt.lib
MT表示静态连接C++运行库,会导致编译后的库文件体积较大。但是不需要目标系统安装VC++运行库。现在基本上运行环境都会有安装VC++ runtime,因此选择MD版本能够更加节省资源。
(CMAKE是一个跨平台的配置编译依赖的工具。它能生成每个平台下不同的编译配置文件。比如Windows上的.sln, Linux下的Makefile,MacOSX下的xcode等)
选择最新的Windows x64版本下载安装即可
CMAKE配置过程会生成build目录(用于生成.sln的目录)以及install目录(编译后会生成include, lib等提供给其他程序编译使用)
这里分别建立 D:\DCMTK\dcmtk-3.6.6-build 以及 D:\DCMTK\dcmtk-3.6.6-install 两个目录
最后整个目录结构图如下所示:
由于项目中需要用到DCMTKJP2K组件(需要另行付费购买)
将dcmtkjp2k的源文件放入“D:\DCMTK\dcmtk-3.6.6”目录中
修改“D:\DCMTK\dcmtk-3.6.6”中的CMakeList.txt 并在其中找到“# Modules to be built”在后面添加“dcmtkjp2k”
修改后的CMakelist.txt文件如下:
此时准备工作完成。
首先配置源代码(DCMTK的源代码)路径和BUILD路径(后续用Visual Studio构建编译lib的路径):
这里用的是VS2017 以及生成的是x64.
接着CMAKE会开始扫描本机的编译环境并进行相关的配置。这一步大概要花费十来分钟。
配置完后会有许多错误,这里先选择分组
然后配置WITH中的项目 :
这里需要配置
WITH_LIBCONVINC (字符串编码转换相关的库)
D:\DCMTK\dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8\libiconv-1.16
WITH_LIBPNGINC (支持PNG的编解码)
D:/DCMTK/dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8/libpng-1.6.37
WITH_LIBTIFFINC (支持TIFF的编解码)
D:/DCMTK/dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8/libtiff-4.2.0
WITH_LIBXMLINC (支持LibXML)
D:/DCMTK/dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8/libxml2-iconv-2.9.10
WITH_OPENJPECINC (支持JPEG的编解码)
D:/DCMTK/dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8/openjpeg-2.4.0
WITH_OPENSSLINC (支持OPENSSL相关的加解密,网络传输等)
D:\DCMTK\dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8\openssl-1.1.1i
WITH_SNDFILEINC (不设置)
空
WITH_ZLIBINC (支持Zlib库进行解压缩等)
D:/DCMTK/dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8/zlib-1.2.11
配置好以后的如图所示:
注意:这里的配置的目录要求所有配置的目录中都应该是这样的结构 这里以libiconv为例
其中include存放了相关的头文件,lib文件夹中应包含:
*_d.lib debug库连接用的静态库
*_o.lib release库连接用的静态库
如果要自行编译这些库一定要最后按照这样的格式来存放。否则后续编译连接会报大量的错误。
这里就把刚才配置依赖的几个都打勾即可。
DCMTK_OVERWRITE_WIN32_COMPILER 如果要编译MD版本的库这个选限一定要取消否则后面用VS编译连接的适合会报连接错误
DCMTK自带的Limits模板在编译某些模块(如某些版本的DCMJP2K)会有冲突,因此使用C++ STL自带的numeric_limits模板
启用DCMTK_ENABLE_STL_LIMITS ON
配置编译后DCMTK的安装目录 CMAKE_INSTALL_PREFIX
D:\DCMTK\dcmtk-3.6.6-install
把这里所有带MT MTd的编译选限全部改成MD MDd
修改后如下
如果后续要生成动态库就选择
可以选择仅生成一个动态库:
笔者这里生成的是静态库就不选了
这次就十几秒
这里可能会有一些警告信息,暂时忽略吧
选择Open Project会启动Visual Studio打开刚才生成的.sln文件
这里先编译DEBUG版本为例:
选择Build->Batch Build
然后选择第一个ALL_BUILD DEBUG x64
开始构建工程,整个过程大概要20分钟。
最后终于编译成功 103成功,0错误
接着选择Build->Batch Build然后选择构建Install
此时会将编译好的lib和配置好的include文件放入前面设置的安装目录
用同样的方法可以编译Release版的DCMTK静态库并Install
DCMTK库的依赖关系:
dcmdata :==>: ofstd
dcmimage :==>: dcmimgle, dcmdata, ofstd
dcmimgle :==>: dcmdata, ofstd
dcmjpeg :==>: ijg8, ijg12, ijg16, dcmimage, dcmimgle, dcmdata, ofstd
dcmnet :==>: dcmdata, ofstd
dcmpstat :==>: dcmimage, dcmimgle, dcmsign, dcmsr, imagectn, dcmtls, dcmnet, dcmdata, ofstd
dcmsign :==>: dcmdata, ofstd
dcmsr :==>: dcmdata, ofstd
dcmtls :==>: dcmnet, dcmdata, ofstd
dcmwlm :==>: dcmnet, dcmdata, ofstd
imagectn/dcmqrdb :==>: dcmnet, dcmdata, ofstd
引用官网
The DCMTK is functionally structured into so-called modules. For each module there is a directory in DCMTK's main directory.
These are the modules of the public DCMTK toolkit (version 3.6.0):
- config: Module for configuring compilation of DCMTK
- ofstd: General purpose library including string class, etc.
- oflog: A logging library based on log4cplus
- dcmdata: Module for reading, modifying and writing DICOM data structures
- dcmimgle: Module for processing DICOM images (grayscale)
- dcmimage: Module for processing DICOM images (color)
- dcmnet: Module for the DICOM network protocol
- dcmqrdb: Module providing a simple test PACS
- dcmsr: Module implementing DICOM Structured Reporting (SR)
- dcmwlm: Module implementing a DICOM worklist server
- dcmjpeg: Module implementing a DICOM JPEG codec
- dcmjpls: Module implementing a DICOM JPEG-LS codec
- dcmpstat: Module implementing DICOM Presentation States
- dcmsign: Module implementing DICOM signatures etc.
- dcmtls: Module implementing secure networking for DICOM
- docs: Module containing some general documents about DCMTK
- doxygen: Module for generating API documentation with doxygen
Documentation on the DCMTK is available online.
Dependencies
This image illustrates the dependencies between the public modules (as of DCMTK 3.6.4):