DCMTK3.6.5编译说明(ChatGPT翻译)
DICOM工具包(DCMTK)安装
先决条件
DICOM工具包(DCMTK)需要使用C++编译器进行编译。我们建议使用GNU C++编译器的版本高于4.2.1(在此版本的开发中,大部分工作是在Debian Linux上使用GNU C++ 6.3.0完成的)。该软件也已知可以使用SUNPro C++编译器、Clang和Microsoft Visual Studio进行编译。
与其他C++编译器的兼容性未知,然而,我们已经尽量将语言要求降至最低(已避免使用新的C++特性,如异常和RTTI,并为所有使用的STL类提供了回退实现)。
您需要数百兆字节的磁盘空间来编译所有软件。
支持的系统
Microsoft Windows
DCMTK软件可以在本机Microsoft Windows环境下进行编译(有关更多信息,请参见下面的“使用CMake的Microsoft Windows”部分)。
当前(次要)版本在以下操作系统/硬件/编译器组合上成功编译:
Windows 7 / Intel x86 / Microsoft Visual C++ 2008 Express (VS 9) Windows 7 / Intel x86 / Microsoft Visual C++ 2010 Express (VS 10) Windows 7 / Intel x86 / Microsoft Visual C++ 2012 Express (VS 11) Windows 7 / Intel x86 / Microsoft Visual C++ 2013 Express (VS 12) Windows 7 / Intel x86 / Microsoft Visual C++ 2015 Community (VS 14) Windows 7 / Intel x86 / Microsoft Visual C++ 2017 Community (VS 15) Windows 7 / Intel x86 / MinGW gcc 7.4.0 (i686-w64-mingw32) Windows 7 / amd64|x86_64 / Microsoft Visual C++ 2010 Express (VS 10) Windows 7 / amd64|x86_64 / Microsoft Visual C++ 2012 Express (VS 11) Windows 7 / amd64|x86_64 / Microsoft Visual C++ 2013 Express (VS 12) Windows 7 / amd64|x86_64 / Microsoft Visual C++ 2015 Community (VS 14) Windows 7 / amd64|x86_64 / Microsoft Visual C++ 2017 Community (VS 15) Windows 7 / amd64|x86_64 / Microsoft Visual C++ 2019 Community (VS 16) Windows 7 / amd64|x86_64 / MinGW gcc 8.2.1 (x86_64-w64-mingw32) Windows 10 / amd64|x86_64 / Microsoft Visual C++ 2019 Community (VS 16)
Unix(或类似系统)
当前的DCMTK软件版本在以下操作系统/硬件/编译器组合上成功编译,使用下面给出的说明:
FreeBSD 12.0 / amd64|x86_64 / Clang 6.0.1 Linux 3.2.0 / amd64|x86_64 / GNU gcc 4.4.7 (Debian 7.11) Linux 3.10.0 / amd64|x86_64 / Clang 3.4.2 (CentOS 7.7) Linux 3.10.0 / amd64|x86_64 / GNU gcc 4.8.5 (CentOS 7.7) Linux 3.13.0 / amd64|x86_64 / Clang 3.9.1 (Linux Mint 17.3) Linux 3.13.0 / amd64|x86_64 / GNU gcc 4.8.5 (Linux Mint 17.3) Linux 3.13.0 / amd64|x86_64 / GNU gcc 5.5.0 (Linux Mint 17.3) Linux 3.13.0 / amd64|x86_64 / GNU gcc 6.5.0 (Linux Mint 17.3) Linux 3.13.0 / amd64|x86_64 / GNU gcc 8.3.0 (Linux Mint 17.3) Linux 4.19.0 / Intel x86 / Clang 7.0.1 (Debian 10) Linux 4.19.0 / Intel x86 / GNU gcc 8.3.0 (Debian 10) Linux 4.19.0 / amd64|x86_64 / Clang 7.0.1 (Debian 10) Linux 4.19.0 / amd64|x86_64 / GNU gcc 8.3.0 (Debian 10) Linux 5.0.0 / amd64|x86_64 / gcc 8.3.0 (Ubuntu Linux) Linux 5.3.7 / amd64|x86_64 / Clang 9.0.0 (Arch Linux) Linux 5.3.7 / amd64|x86_64 / GNU gcc 9.2.0 (Arch Linux) MacOS X 10.15 / amd64|x86_64 / Apple Clang 11.0.0 MacOS X 10.15 / amd64|x86_64 / GNU gcc 9.2.0 OpenBSD 6.5 / amd64|x86_64 / Clang 7.0.1 OpenBSD 6.5 / amd64|x86_64 / GNU gcc 4.2.1 OpenIndiana / Intel x86 / GNU gcc 8.3.0 (OpenIndiana 2019.04) Solaris 11.3 / Intel x86 / GNU gcc 4.8.2 Solaris 11.3 / Intel x86 / SunPro CC 5.14 (Oracle Developer Studio 12.5) Solaris 11.3 / Intel x86 / SunPro CC 5.15 (Oracle Developer Studio 12.6)
交叉编译
当前版本的DCMTK可以进行交叉编译,目标平台包括:
Android / arm64 / GNU gcc 6.3.0 (API 24, ABI arm64-v8a)
目前,使用CMake进行交叉编译支持运行配置和单元测试,需要在目标为Android或Windows时分别使用Android模拟器或Wine。其他版本的Android可能也能工作,但上述提到的版本目前是唯一经常测试的版本。
其他平台
上一个次要版本DCMTK 3.6.4 还在以下可能仍然可用但未在此次次要版本中重新测试的平台上进行了测试:
Linux 3.2.0 / amd64|x86_64 / GNU gcc 4.8.4 (Debian 7.11) Linux 3.16.0 / armv7|armhf / GNU gcc 4.9.4 (Debian 8) Linux 4.19.4 / amd64|x86_64 / Clang 7.0.0 (Arch Linux) Linux 4.19.4 / amd64|x86_64 / GNU gcc 8.2.1 (Arch Linux) NetBSD 8.0 / amd64|x86_64 / Clang 5.0.2 NetBSD 8.0 / amd64|x86_64 / GNU gcc 5.5.0 Windows 7 / Intel x86 / Microsoft Visual C++ 2005 Express (VS 8) Windows 10 / Intel x86 / Microsoft Visual C++ 2015 Community (VS 14) Windows 10 / amd64|x86_64 / Microsoft Visual C++ 2015 Community (VS 14) Windows 10 / amd64|x86_64 / Microsoft Visual C++ 2017 Community (VS 15)
上一个次要版本DCMTK 3.6.3 还在以下可能仍然可用但未在此次次要版本中重新测试的平台上进行了测试:
Linux 3.16.0 / amd64|x86_64 / Clang 3.5.0 (Debian 8.8) Linux 3.2.0 / amd64|x86_64 / GNU gcc 4.7.2 (Debian 7.11) Linux 4.10.0 / amd64|x86_64 / GNU gcc 6.3.0 (Ubuntu 17.04) Linux 4.10.0 / amd64|x86_64 / Clang 4.0.0 (Ubuntu 17.04) MacOS X 10.10.4 / amd64|x86_64 / Apple Clang 6.0 Windows 7 / amd64|x86_64 / CygWin 2.8.0 (gcc 6.3.0) OpenIndiana / Intel x86 / Clang 4.0.0 (OpenIndiana 2017.04)
上一个发布的DCMTK 3.6.2 还在以下可能仍然可用但未在此次次要版本中重新测试的平台上进行了测试:
QNX 6.5 / Intel x86 / GNU gcc 4.4.2(请参见注释*1) Windows 8.1 / Intel x86 / Microsoft Visual C++ 2008 Express (VS 9) Windows 8.1 / Intel x86 / Microsoft Visual C++ 2010 Express (VS 10) Windows 8.1 / Intel x86 / Microsoft Visual C++ 2012 Express (VS 11) Windows 8.1 / Intel x86 / Microsoft Visual C++ 2015 Express (VS 14) Windows 8.1 / Intel x86 / Microsoft Visual C++ 2017 Community (VS 15) Windows 8.1 / amd64|x86_64 / Microsoft Visual C++ 2010 Express (VS 10) Windows 8.1 / amd64|x86_64 / Microsoft Visual C++ 2012 Express (VS 11) Windows 8.1 / amd64|x86_64 / Microsoft Visual C++ 2015 Express (VS 14) Windows 8.1 / amd64|x86_64 / Microsoft Visual C++ 2017 Community (VS 15)
交叉编译器:
Windows 7 / Intel x86 / MinGW gcc 4.9.1(Linux主机) Windows 7 / amd64|x86_64 / MinGW gcc 4.9.1(Linux主机)
DCMTK的早期版本已知还能在我们目前无法再进行测试的其他平台上编译,例如AIX,HP-UX,IRIX,NeXTStep,OSF/1,Solaris/SunOS,Ultrix。Intel C++编译器和其他编译器可能仍然可用,但在这次测试中我们没有对它们进行测试。
平台注意事项
(*1)QNX 6.5需要在运行配置过程后但在开始编译之前,从“config/include/dcmtk/config/osconfig.h”中删除或禁用定义“HAVE_IEEEFP_H”。
OPENSSL支持
从版本3.4.2开始,DCMTK支持使用DICOM第15部分中定义的传输层安全性(TLS)协议进行加密的网络传输。DCMTK依赖于OpenSSL工具包(www.openssl.org)进行底层加密例程和TLS协议实现。
此版本的DCMTK需要OpenSSL 1.0.1或更新版本,因为旧版本不支持最近的DICOM安全配置所需的TLS 1.2协议。我们建议使用OpenSSL 1.0.2或更新版本,因为从此OpenSSL版本开始才提供了RFC 7525 / BCP 195建议的一些可选功能。此外,用户应确保应用了最新的OpenSSL补丁级别。
在使用CMake时,如果希望支持安全增强功能,则在编译DCMTK期间必须提供OpenSSL库和头文件的已编译版本。默认情况下,DCMTK会检查是否安装了OpenSSL,并在存在时自动启用支持。默认情况下,DCMTK检查Unix平台上的标准路径。对于Windows平台,请查看下面关于CMake的讨论。
ZLIB支持
从版本3.5.2开始,DCMTK支持“Deflated Explicit VR Little Endian”传输语法,即ZIP压缩的网络传输和媒体存储。DCMTK依赖于zlib工具包(www.zlib.org)进行底层压缩例程。已知此版本的DCMTK可以与zlib的1.2.8到1.2.11版本编译,尽管其他版本可能也能正常工作。
在使用CMake时,必须在编译DCMTK期间提供已编译版本的zlib库和头文件。请参见下面关于CMake的讨论。
LIBTIFF支持
从版本3.5.1开始,DCMTK支持将DICOM图像转换为TIFF格式。DCMTK依赖于libtiff工具包(www.libtiff.org)进行此操作。已知此版本的DCMTK可以与libtiff的3.8.2到4.10.0版本编译,尽管其他版本可能也能正常工作。但是,早于版本3.7.0的libtiff发布版本将不起作用,因为TIFFCleanup()函数尚不可用。在Windows上,由于libtiff中的不兼容API更改,需要libtiff 3.7.4或更高版本。
在使用CMake时,必须在编译DCMTK期间提供已编译版本的libtiff库和头文件。请参见下面关于CMake的讨论。
LIBPNG支持
从版本3.5.3开始,DCMTK支持将DICOM图像转换为PNG格式。DCMTK依赖于libpng工具包(www.libpng.org)进行此操作。已知此版本的DCMTK可以与当前的libpng发布版本1.2.50到1.6.37编译,尽管其他版本可能也能正常工作。
在使用CMake时,必须在编译DCMTK期间提供已编译版本的libpng库和头文件。请参见下面关于CMake的讨论。
LIBXML2支持
从版本3.5.3开始,DCMTK支持将XML文档转换为DICOM文件。DCMTK依赖于libxml2工具包(www.libxml.org)进行此操作。已知此版本的DCMTK可以与libxml2发布版本2.9.4到2.9.9编译,尽管其他版本可能也能正常工作。
在使用CMake时,如果需要支持XML导入,则必须在编译DCMTK期间提供已编译版本的libxml2(可能还包括iconv)库和头文件。请参见下面关于CMake的讨论。
TCP WRAPPER(LIBWRAP)支持
从版本3.5.3开始,DCMTK支持Wietse Venema的TCP包装库(libwrap),该库在大多数Unix平台上可以免费获取,并且是大多数最新Linux发行版的默认安装的一部分。此库允许通过“/etc/hosts.deny”和“/etc/hosts.allow”配置文件强制进行基于主机的访问控制。有关详细信息,请参见hosts_access(5)手册页。
在使用CMake时,如果需要支持TCP包装,则在编译DCMTK期间必须提供已编译版本的libwrap库和包含文件<tcpd.h>。请参见下面关于CMake的讨论。
由于DCMTK使用C++代码中的TCP包装,因此需要一个与ANSI C兼容的头文件<tcpd.h>。 TCP包装库的官方7.6版本不与ANSI C兼容,不能与DCMTK一起使用(即DCMTK的configure脚本不会识别它)。然而,许多当前的Linux和BSD发行版都附带了一个与ANSI C兼容的头文件。
字符集转换支持
从版本3.6.2开始,DCMTK支持不同字符编码之间的转换,例如UTF-8和ISO Latin 1。为此,DCMTK依赖于以下替代方案之一,以便作为底层实现可用:libiconv、ICU库或包含在C标准库中的iconv功能。
DCMTK会检测这些实现的可用性,并在多个可用时自动选择其中一个,选择的顺序如下:当前首选libiconv实现,因为其集成最为成熟。如果它不可用,则ICU实现是下一个最佳选择。否则,将选择C标准库中包含的iconv实现(如果所使用的C标准库提供)。可以通过"--enable-charconv"参数(Autoconf)或"DCMTK_ENABLE_CHARSET_CONVERSION"(CMake)覆盖此选择。选择不可用的实现将被忽略,即用户选择将被覆盖。
LIBICONV支持
libiconv工具包(www.gnu.org/s/libiconv/)可以用作DCMTK底层字符集转换实现。已知此版本的DCMTK可以与libiconv发布版本1.15编译,尽管其他版本可能也能正常工作。
在使用CMake时,必须在编译DCMTK期间提供已编译版本的libiconv和libcharset库以及头文件。请参见下面关于CMake的讨论。
ICU支持
DCMTK支持作为上述提到的libiconv的替代方案的国际Unicode组件(ICU)库。已知此版本的DCMTK可以与ICU发布版本59.1到65.1编译,尽管其他版本可能也能正常工作。
ICU可能更容易集成到一些较新的Linux发行版(例如Arch Linux)和Windows中,但由于当前集成方式的原因,它不支持转换以下字符集:
ISO 2022 IR 87 ISO 2022 IR 159
此外,基于ICU的实现目前不支持音译。
在使用CMake时,如果希望使用ICU进行字符集转换的支持,则在编译DCMTK期间必须提供已编译版本的ICU库和头文件。请参见下面关于CMake的讨论。
C标准库中提供的iconv支持
DCMTK允许在某些平台上使用作为C标准库的一部分提供的iconv实现。使用此实现构建DCMTK可能更容易,减少额外的运行时依赖性,但应谨慎使用:不同C标准库提供的iconv实现可能在支持的字符集和功能方面有所不同。
如果可能,应首选libiconv实现。最重要的是,一些由C标准库提供的iconv实现不支持将转换为终端当前使用的任何字符集,这被认为是至关重要的,因此强烈建议不要使用这些实现(针对此问题有一个新的configure测试,允许在API级别上查询对此的支持)。
已知问题
如果C标准库和libiconv都在默认搜索路径中可用,而用户选择(--enable-charconv或DCMTK_ENABLE_CHARSET_CONVERSION)独立于用户选择,可能会错误地包含错误的<iconv.h>。
DCMTK目前没有机制强制包含特定的<iconv.h>,因此必须通过手动修改包含路径和/或DCMTK的代码来实现。一些平台(例如Arch Linux)甚至将作为libiconv的一部分提供的<iconv.h>重命名为<libiconv.h>或类似的名称,以避免名称冲突。在这种情况下,用户必须修改DCMTK的源代码以包含正确的文件,因为目前我们没有为此提供配置测试。
使用本地STL
DCMTK可以配置为使用编译器/运行时环境提供的STL(标准模板库)功能,而不是默认使用的自身的回退实现。
可以通过"--enable-stl"参数(Autoconf)或将"DCMTK_ENABLE_STL"设置为"ON"(CMake)来实现。但是,这不会强制启用使用本地STL功能,而是触发运行多个配置测试,以检测个别功能是否按照DCMTK所期望/要求的方式正常工作。例如,已知某些Visual Studio 2005版本提供的std::list和std::vector实现存在严重错误,可能导致段错误,并且std::error_code在我们了解的任何Visual Studio版本上目前都没有正确实现。
此外,还可以独立于"--enable-stl"或"DCMTK_ENABLE_STL"的设置启用或禁用个别的STL功能:使用"--enable-stl-<feature>"、"--disable-stl-<feature>"和/或"DCMTK_ENABLE_STL_<FEATURE>(ON/OFF)",例如"--disable-stl-vector"或"-DDCMTK_ENABLE_STL_STRING=ON"。
支持现代C++标准
DCMTK可以配置为使用现代C++标准的多个功能,例如(例如C++11的移动语义、可变参数模板等),而不是使用自身的解决方法和回退实现。这可以通过使用CMake的变量"CMAKE_CXX_STANDARD"和"CMAKE_CXX_STANDARD_REQUIRED"来实现。先前的机制只处理C++11,适用于旧版本的CMake(版本在3.1.3之前):将"DCMTK_ENABLE_CXX11"设置为"ON"。对于Autoconf,请使用"--enable-cxx11"参数。现在,"DCMTK_ENABLE_CXX11"变量和Autoconf支持已过时,将在将来的版本中删除。
启用例如C++11将更改DCMTK API的某些部分,因此DCMTK的C++11构建可能与DCMTK的经典构建不兼容。因此,此设置存储在"config/include/dcmtk/config/osconfig.h"中,并在编译DCMTK本身或包含它的任何程序时进行验证。
将CMAKE_CXX_STANDARD设置为'11'或某个更新的C++标准不会强制DCMTK使用相应的功能,而是会触发运行一些配置测试,只有真正支持的功能才会被启用(例如,在较新版本的Visual Studio上,std::error_code仍未按照预期实现,因此我们继续使用DCMTK的自己的实现)。
请注意,此设置不依赖于启用STL功能,但并非所有组合(例如启用C++11但禁用std::string)都可能起作用。
构建
CMake现在是配置DCMTK构建的默认工具。CMake是一个跨平台的、开源的构建系统,可以使用简单的配置文件控制软件编译过程。可以免费从https://cmake.org/获取CMake。为了配置DCMTK,该工具包含所有必要目录中相应的"CMakeLists.txt"文件。详细来说,这些"CMakeLists.txt"文件将作为CMake的输入,CMake将从这些文件生成所有DCMTK项目的适当的构建文件。
DCMTK 3.6.5需要CMake版本2.8.5或更高。我们建议使用最新稳定版本的CMake(目前版本为3.15.4),因为较新版本的CMake在出现错误时通常提供更好的输出,并且通常更容易使用(例如通过更好地支持检测第三方库的可用性)。如果可能的话,使用操作系统提供的软件包管理器提供的CMake版本。
有关使用CMake构建DCMTK的更多信息,请参阅DCMTK的维基:
https://support.dcmtk.org/wiki/dcmtk/howto/cmakeconfiguration
CMake和共享库
CMake构建系统允许构建共享库而不是静态库。在Windows系统上,这些是动态链接库(.dll)。在Unix系统上,这些是共享对象(.so)。要启用此选项,请将"BUILD_SHARED_LIB"选项设置为"ON"。
此外,可以为整个工具包生成一个单一的共享库。此模式由"BUILD_SINGLE_SHARED_LIBRARY"选项控制。如果不想将整个工具包放入一个单一的共享库中,可以修改"DCMTK_MODULES"缓存变量以选择可用模块的子集。请注意,此选项被标记为高级选项,因此默认情况下被隐藏。此外,在构建单一共享库时,无法构建应用程序和测试。
CMAKE_BUILD_TYPE的默认值
如果所选的构建文件生成器未指定CMAKE_BUILD_TYPE的值,则将其设置为"Release"。对于支持多个配置类型(例如Debug、Release)的生成器,CMAKE_CONFIGURATION_TYPES保存可能的值。对于其他生成器,此值为空,对于这些生成器,CMake固定了构建类型,否则无法更改。请注意,Visual Studio会忽略CMAKE_BUILD_TYPE,并始终以"Debug"启动,因此最好在开始构建过程之前手动将其更改为"Release"。
要禁用CMAKE_BUILD_TYPE的默认值,请在CMake配置期间将CMAKE_BUILD_TYPE设置为"None",例如在命令行上使用"-DCMAKE_BUILD_TYPE:STRING=None"。如果需要手动控制编译器标志(例如在环境变量如CXXFLAGS中定义),并且不希望使用与所选配置类型相关的任何CMake默认值,则这可能很有用。
DCMTKConfig.cmake和DCMTKTargets.cmake
CMake允许编写描述DCMTK构建配置(DCMTConfig.cmake)以及已生成的所有目标(可执行文件和库)的文件(DCMTKTargets.cmake)。通过在"CONFIG"模式下使用CMake的find_package()机制,外部项目可以利用这些文件,以调整其自己的构建配置,并直接使用所有可用的目标库和可执行文件。
在使用CMake版本大于或等于2.8.8的系统上,在安装期间,这些文件将被写入安装目录的子目录"/cmake"(在Windows系统上)和"/lib/cmake/dcmtk"(在类Unix系统上)。此外,这些文件在构建过程中将被写入CMake构建树的主目录,所有内容(例如DCMTConfig.cmake中的包含路径)都指向构建树的正确值。因此,甚至可以使用外部项目来处理这两个文件的DCMTK构建树。
在使用低于2.8.8版本的CMake的系统上,只会创建一个简化的DCMTKConfig.cmake,它仅在安装树中可用。DCMTKTargets.cmake根本不会创建。
Microsoft Windows使用CMake
使用CMake是在Windows上编译DCMTK的唯一支持的方式。为了能够这样做,请执行以下步骤在您的计算机上安装CMake:
- 访问 https://cmake.org/ 下载Windows的最新发行版本CMake。
- 执行下载的文件以在您的计算机上安装CMake。按照所有安装说明适当地进行操作。
为了通过CMake手动配置上述外部库(OpenSSL、zlib、libtiff、libpng、libxml2和libiconv或ICU)的支持,请执行以下步骤:
-
转到“开始” -> “程序” -> “CMake” -> “CMake”或“CMake(cmake-gui)”以启动CMake工具,通过该工具可以进行配置。
-
在“源代码在哪里:”输入框中,输入DCMTK源代码所在的目录,例如“C:\dcmtk-3.6.5”。
-
在“二进制文件的构建位置:”输入框中,输入要构建库和二进制文件的目录,例如“C:\dcmtk-msvc15”。
-
在“构建:”或“为此项目指定生成器:”下拉框中,选择要用于编译DCMTK的相应开发环境,例如“Visual Studio 15 2017 Win64”。
-
点击“配置”(CMake将寻找相应的编译器,读取所有DCMTK的“CMakeLists.txt”文件并执行一些测试。表格区域中的变量将显示为红色。现在可以设置这些变量以打开或关闭对任何外部库的支持)。
-
在CMake的用户界面中进行相应的配置。例如,为了打开libxml2支持,请将变量“DCMTK_WITH_XML”的值设置为“ON”,并将变量“WITH_LIBXMLINC”的值设置为libxml2的包含文件和库所在的路径,例如“C:\libxml2-2.9.7”。所有其他外部库的支持可以通过类似的方式打开:
libpng支持: 将“DCMTK_WITH_PNG”设置为“ON”并将“WITH_LIBPNGINC”设置为例如“C:\libpng-1.6.37”
libtiff支持: 将“DCMTK_WITH_TIFF”设置为“ON”并将“WITH_LIBTIFFINC”设置为例如“C:\libtiff-4.0.10”
OpenSSL支持: 将“DCMTK_WITH_OPENSSL”设置为“ON”并将“WITH_OPENSSLINC”设置为例如“C:\openssl-1.1.1d”
zlib支持: 将“DCMTK_WITH_ZLIB”设置为“ON”并将“WITH_ZLIBINC”设置为例如“C:\zlib-1.2.11”
libiconv支持: 将“DCMTK_WITH_ICONV”设置为“ON”并将“WITH_LIBICONVINC”设置为例如“C:\libiconv-1.15”
为了关闭对某个外部库的支持,请将相应变量("DCMTK_WITH_XML"、"DCMTK_WITH_PNG"、"DCMTK_WITH_TIFF"、"DCMTK_WITH_OPENSSL"、"DCMTK_WITH_ZLIB" 或 "DCMTK_WITH_ICONV")的值设置为 "OFF"。
(请注意,所有外部库的包含文件总是期望在指定为 "WITH_LIBXMLINC"、"WITH_LIBPNGINC"、"WITH_LIBTIFFINC"、"WITH_OPENSSLINC"、"WITH_ZLIBINC" 或 "WITH_LIBICONVINC" 的目录的下面的名为 "include" 的目录中。)
(还请注意,所有外部库的库文件总是期望在指定为 "WITH_LIBXMLINC"、"WITH_LIBPNGINC"、"WITH_LIBTIFFINC"、"WITH_OPENSSLINC"、"WITH_ZLIBINC" 或 "WITH_LIBICONV" 的目录的下面的名为 "lib" 的目录中。此外,请注意以下文件名必须用于相应的库文件:
-
libxml2:
- "iconv_d.lib" - 调试版本
- "iconv_o.lib" - 发布版本(优化)
- "libxml2_d.lib" - 调试版本
- "libxml2_o.lib" - 发布版本(优化)
-
libpng:
- "libpng_d.lib" - 调试版本
- "libpng_o.lib" - 发布版本(优化)
-
libtiff:
- "libtiff_d.lib" - 调试版本
- "libtiff_o.lib" - 发布版本(优化)
-
OpenSSL:
- "dcmtkcrypto_d.lib" - 调试版本
- "dcmtkcrypto_o.lib" - 发布版本(优化)
- "dcmtkssl_d.lib" - 调试版本
- "dcmtkssl_o.lib" - 发布版本(优化)
-
zlib:
- "zlib_d.lib" - 调试版本
- "zlib_o.lib" - 发布版本(优化)
-
libiconv:
- "libiconv_d.lib" - 调试版本
- "libiconv_o.lib" - 发布版本(优化)
- "libchset_d.lib" - 调试版本
- "libchset_o.lib" - 发布版本(优化)
ICU是使用CMake的 "find_package()" 机制集成的,这与其他库使用的手工脚本有些不同。如果您想使用ICU而不是libiconv,您必须通过设置 "FindICU" 模块的适当变量来包含它,参见 https://cmake.org/cmake/help/latest/module/FindICU.html 。
所有库的调试版本必须为多线程调试运行时(/MTd)进行编译,而发布版本必须为非调试多线程运行时(/MT)进行编译。所有库的预编译版本可以从 https://www.dcmtk.org/dcmtk#lib-win 下载。
- 再次点击 "Configure"。 (CMake 将根据显示的规范调整配置。)
- 点击 "OK" 或 "Generate"。 (CMake 将在相应的目录中生成新的项目文件。这些文件将根据显示的规范进行调整,即对外部库的支持将被打开或关闭。)
完成这些步骤后,可以启动 Microsoft Visual Studio IDE,打开 DCMTK 的工作区文件,并构建一个或多个 DCMTK 的子项目。如果要构建所有库和应用程序,请标记 "ALL_BUILD" 子项目并构建它。 "INSTALL" 子项目将可执行文件、库文件、包含文件、支持文件和文档文件安装到由变量 "CMAKE_INSTALL_PREFIX" 指定的目录中(与 Unix 系统上的 "make install-all" 非常类似)。
在配置和生成项目文件之前,可以通过将 "BUILD_APPS" 选项设置为 "OFF" 来禁用各种命令行应用程序(包括测试程序)的编译和安装。默认情况下,将构建和安装所有命令行应用程序。
请注意,其他 Windows 编译器,例如 Borland C++ Builder,目前并未得到积极支持。然而,它们可能也能正常工作。
DCMTK 在 Windows 平台的已知限制:
- dcmqrscp 工具无法触发多个进程。每个关联必须在可能建立新关联之前完全处理。
- Visual C++ 包含两种不同的 I/O 流实现,不应该在一个应用程序中混合使用,因为这可能导致难以找到的应用程序错误。旧的、现在已弃用的实现使用传统的 cfront 头文件 <iostream.h> 等。新的实现使用 ANSI/ISO C++ 中定义的 <iostream> 等。DCMTK 可以配置为使用这两个接口中的任何一个。此行为可以在 "config/include/dcmtk/config/osconfig.h" 文件中更改,该文件位于声明 USE_STD_CXX_INCLUDES 符号的构建目录中。
- 在定义 UNICODE 或 _UNICODE 时,DCMTK 无法编译,因为VisualStudio编译器会对所有 Windows API 函数使用 Unicode 版本,而不是 ANSI 版本(即对于所有字符字符串参数和返回值,使用 wchar_t 而不是 char)。
在 Unix 类系统上使用 CMake 进行构建的一个关键区别是,我们对所有外部库使用 "find_package()" 机制,而不仅仅是 ICU。大多数 Unix 类系统都提供了包管理器,即使没有,至少也有一个一致的方法来安装库和包含文件,以便 CMake 的 "find_package()" 机制通常可以直接找到它们。
如果这种方法不起作用,或者您想使用与默认搜索路径中的库版本不同的版本,您应该查看相应的 "find_package()" 模块的文档,以了解需要修改哪些变量,例如 "FindZLIB" 来控制使用哪个版本的 zlib:https://cmake.org/cmake/help/latest/module/FindZLIB.html 。
在 Unix 类系统上使用 CMake 构建 DCMTK 的典型方式如下(如果不使用 GUI,请查看上面的 Windows 描述):
mkdir dcmtk-3.6.5-build cd dcmtk-3.6.5-build cmake ../dcmtk-3.6.5 make -j8 make DESTDIR=../dcmtk-3.6.5-install install
上述命令假定 DCMTK 源代码已提取到当前工作目录中,放置在名为 dcmtk-3.6.5 的文件夹中。DCMTK 将使用 CMake 配置为默认选项,检测和包括所有可用的支持库,然后使用八个 CPU 内核进行编译('make -j8',根据需要进行调整)。结果将安装到源代码目录旁边的 "dcmtk-3.6.5-install" 目录中。
如果您想要修改构建配置,比如启用或禁用 DCMTK 的一些功能(例如 PNG 支持),或者如果需要修改预定义的构建变量,可以使用基于 curses 的 CMake 配置工具 'ccmake'。首先,创建初始构建设置(系统检查),然后调用 ccmake:
mkdir dcmtk-3.6.5-build cd dcmtk-3.6.5-build cmake ../dcmtk-3.6.5 ccmake ../dcmtk-3.6.5
现在,您可以修改配置值。请查看屏幕底部的帮助。完成后,按 'c' 生成新的构建配置,然后退出 ccmake。现在,您可以继续通过调用 'make' 等进行构建。
如果您已经知道要设置的变量名称、类型和值,可以跳过上面的 'ccmake' 步骤,直接使用设置过的值调用 'cmake'。例如,对于禁用 TCP 包装的构建:
mkdir dcmtk-3.6.5-build cd dcmtk-3.6.5-build cmake -DDCMTK_WITH_WRAP:BOOL=FALSE ../dcmtk-3.6.5 ...
格式是 NAME:TYPE=VALUE。使用 'ccmake' 查找变量名称和它们的类型(BOOL 具有 TRUE/FALSE 或 STRING)。一些更重要的变量包括:
- BUILD_APPS:构建 DCMTK 命令行工具吗?默认:ON。
- BUILD_SHARED_LIBS:将 DCMTK 库构建为共享库吗?默认:OFF。
- CMAKE_BUILD_TYPE:调试或发布构建,默认:Release。
- CMAKE_INSTALL_PREFIX:安装前缀,默认:/usr/local。
- DCMTK_ENABLE_BUILTIN_DICTIONARY:激活内置的 DICOM 数据字典吗?默认:在 Windows 上为 ON,在 Linux/Posix 上为 OFF。
- DCMTK_ENABLE_CXX11:假定编译器符合 C++11。默认:OFF。
- DCMTK_ENABLE_STL:通过 STL 类替换 DCMTK 的 OFString、OFList、OFVector 等。默认:OFF。
- OPENSSL_ROOT_DIR:安装 OpenSSL 的目录。默认:在标准目录中搜索头文件和库。
HTML 文档和 man 页面
大多数 DCMTK 模块都使用 Doxygen(www.doxygen.org)进行了文档化,这是一个类似于 Javadoc 的免费源代码文档系统。已安装 Doxygen 的 Unix 用户可以在 "dcmtk-3.6.5" 或 "doxygen" 目录中使用 "make html" 创建超文本文档;Windows 和其他 CMake 用户应构建 "DOXYGEN" 子项目。还可以生成用于 Microsoft 的 HTML 帮助工作室的项目文件,从而可以从文档中创建单个 CHM 文件(压缩的 HTML)。通过更改 "doxygen" 目录中的配置文件,还可以启用其他输出格式(例如 LaTeX)。
目前,dcmfg、dcmiod、dcmimage、dcmimgle、dcmjpeg、dcmpmap、dcmpstat、dcmrt、dcmseg、dcmsign、dcmsr、dcmtls、dcmtract、dcmwlm 和 ofstd 都已完全文档化;dcmdata、dcmjpls、dcmnet 和 oflog 几乎已完全文档化。请参阅FAQ条目:"文档的其余部分在哪里?"
在 Unix 平台上,所有命令行工具的 man 页面都会在 "make install" 步骤期间安装。为了使用它们,只需将目录(例如 "/usr/local/share/man")添加到 MANPATH 环境变量中,然后尝试 "man dcmdump" 以检查是否正常工作。
要从 man 页面生成纯文本文件,请在 "doxygen" 目录中调用 "make text"。输出文件存储在 "doxygen/man2text" 目录中。
DICOM 数据字典
几乎所有 DCMTK 工具和库都需要所谓的 DICOM 数据字典(即 DICOM 标准的第6部分的信息)可用,以便将属性标记映射到它们关联的数值表示(VR)、数值多重性(VM)和属性名称(官方关键字)。数据字典可以从文件加载(在 Unix 系统上默认)或嵌入到相应的工具/dcmdata 库中(在 Windows 系统上默认)。可以使用适当的配置选项更改默认行为。
详细信息可以在 "dcmdata/docs/datadict.txt" 文件中找到(或者 "/usr/local/share/doc/dcmtk/datadict.txt")。
编译时标志和环境变量
通过一些编译时标志(宏),可以修改多个 DCMTK 工具和库的行为。那些不会被配置机制自动处理的宏在 "config/docs/macros.txt" 文件中有记录(或者 "/usr/local/share/doc/dcmtk/macros.txt")。
还有一些环境变量会影响 DCMTK 的行为。这些在 "config/docs/envvars.txt" 中有文档记录(或者 "/usr/local/share/doc/dcmtk/envvars.txt")。
运行测试套件
DCMTK 配备了一个测试套件,用于验证工具包是否按预期工作。测试包含在模块的 "tests" 子目录中。一些测试被标记为详尽,并且仅在显式启用时才运行,见下文。
当使用 Autoconf 构建 DCMTK 时,可以通过 "make check" 运行所有测试。如果测试失败,make 将停止,并且应该可以看到失败的测试的失败原因。此外,您可以通过键入 "make check-exhaustive" 运行详尽的单元测试。
您还可以使用 CMake 运行测试套件。但是,运行测试套件所需的步骤取决于所使用的生成器。Visual Studio 生成器将创建一个 "RUN_TESTS" 子项目。构建此项目将调用 CTest 并运行所有测试。使用 Makefile 生成器时,"make test" 运行测试套件。此外,您可以通过键入 "make test-exhaustive" 运行详尽的单元测试。其他生成器应该使用类似的方法。
为了更仔细地检查,可以直接运行单个测试。Makefile 将为每个模块构建测试运行程序,如 "<module>/tests/tests"。CMake 将在该文件名前添加模块名称前缀,例如 "ofstd_tests"。有关更多信息,请使用 --help 选项调用此程序。
构建(使用 Autoconf 的 Unix)
使用 GNU Autoconf 配置 DCMTK 构建已在 DCMTK 3.6.5 版本中弃用,并将在未来版本中删除。在当前版本中,DCMTK 顶层主目录中的 "configure" 脚本已被删除,作为 Autoconf 工具链用户的最终警告。然而,如果您仍然希望使用 Autoconf 构建 DCMTK,仍然是可能的。从顶层(dcmtk-3.6.5)目录执行以下步骤来编译和安装软件:
步骤 0: cd config ./rootconf cd ..
步骤 0 在 DCMTK 的顶层目录中创建 configure 脚本。
步骤 1: ./configure --ignore-deprecation
步骤 1 执行每个子目录中的 configure 脚本。首先,检查系统能力,然后生成 Makefile。默认情况下,可执行文件和其他文件将在相应的子目录中安装(在步骤 3 中)。如果您希望使用另一个安装前缀,可以使用 --prefix=<path> 标志进行配置。例如,如果您希望安装在主目录下的 "~/dicom" 中,那么您应该像这样启动 configure:
./configure --ignore-deprecation --prefix=$HOME/dicom
步骤 1 也是可以启用或禁用外部库支持的地方。默认情况下,所有安装在标准路径的库都会自动启用。使用 --without-openssl 开关来禁用 OpenSSL 支持。--with-opensslinc 选项允许指定 OpenSSL 安装的目录。通常,这是编译和安装 OpenSSL 时使用的 --prefix 指定的目录。
例如,如果您希望启用安全增强功能,并且 OpenSSL 安装在 "/usr/local/apps/openssl-1.1.1d",那么您应该以以下方式启动 configure:
./configure --ignore-deprecation \ --with-opensslinc=/usr/local/apps/openssl-1.1.1d
configure 将假定 OpenSSL 包含文件安装在 "/usr/local/apps/openssl-1.1.1d/include" 中,并期望库在 "/usr/local/apps/openssl-1.1.1d/lib" 中。将适当的选项传递给编译器和链接器。
类似地,可以通过类似的方式启用对 zlib、libtiff、libpng、libxml2、libwrap 和 libiconv 的支持(如果这些库未安装在标准路径中):
./configure --ignore-deprecation \ --with-libzlibinc=/usr/local/apps/zlib-1.2.11 \ --with-libtiffinc=/usr/local/apps/libtiff-4.0.10 \ --with-libpnginc=/usr/local/apps/libpng-1.6.37 \ --with-libxmlinc=/usr/local/apps/libxml2-2.9.9 \ --with-libwrapinc=/usr/local/apps/tcp_wrappers-7.6 \ --with-libiconvinc=/usr/local/apps/libiconv-1.15
或者,使用 libicu:
./configure --ignore-deprecation \ --with-libicuinc=/usr/local/apps/icu-65.1
不同的 configure 选项可以以任何顺序组合。configure --help 将打印所有存在的 configure 选项的列表。configure --help=short 将仅显示特定于 DCMTK 的选项。有用的 configure 选项包括:
- --enable-debug:使用调试代码进行编译,不优化。
- --disable-debug:不使用调试代码进行编译(默认)。
- --enable-threads=TYPE:使用多线程支持进行编译(posix/solaris/auto=default)。
- --disable-threads:不使用多线程支持进行编译。
- --enable-lfs=TYPE:使用大文件支持进行编译(lfs/lfs64/auto=default)。
- --disable-lfs:不使用大文件支持进行编译。
- --enable-std-includes:使用 C++ ANSI 标准包含文件。
- --disable-std-includes:使用旧的 C++ 包含文件。
- --enable-private-tags:启用私有标签字典。
- --disable-private-tags:不启用私有标签字典(默认)。
- --enable-external-dict:启用加载外部字典(默认)。
- --disable-external-dict:不加载外部字典。
- --enable-builtin-dict:启用加载内置字典。
- --disable-builtin-dict:不加载内置字典(默认)。
- --disable-rpath:不将运行时库路径硬编码。
- --enable-charconv=TYPE:启用字符集转换支持(libiconv/libicu/stdlibc/auto=default)。
- --disable-charconv:禁用字符集转换支持。
- --enable-cxx11:使用 C++11。
- --disable-cxx11:不使用 C++11(默认)。
- --enable-stl:使用 C++ STL。
- --disable-stl:不使用 C++ STL(默认)。
步骤 2:
make all
步骤 2 将构建库和可执行文件。如果遇到问题,请参阅下面的“解决配置和编译问题”部分。
步骤 3:
make install
步骤 3 将安装可执行文件和一些支持文件(数据字典、配置和文档文件)。如果还希望安装库和包含文件,请使用 "make install-lib"。对于 HTML 文档(参见下文),请使用 "make install-html"(需要安装 Doxygen);"make install-all" 安装所有上述内容。
如果文件应安装在临时目录中,例如为了创建分发包,请使用 "make install DESTDIR=<path>" 将 <path> 添加到为 configure 指定的安装目录之前。
步骤 4:
make distclean
步骤 4 将将源树还原到步骤 1 之前的状态。如果只想摆脱对象文件和本地可执行文件,请改用 "make clean"。
注意:如果您不想编译所有模块,可以在步骤 1 之前从文本文件 "config/modules" 中删除这些模块,并执行以下命令:
cd config ./rootconf cd ..
这将在顶层工具包目录中生成一个新的 Makefile 和配置脚本。
解决 Autoconf 的配置和编译问题
configure 脚本可能无法猜测要使用的正确编译器和编译器标志。例如,我们注意到在某些系统上使用 GNU C++ 编译器的 -pedantic 标志会导致编译错误,原因是系统包含具有不正确 ANSI 函数原型的文件。
您可以在调用 configure 之前(在上述步骤 1 之前)设置环境变量以初始化 configure:
- 将环境变量 CC 设置为您的 C 编译器的名称。
- 将环境变量 CFLAGS 设置为您的 C 编译器的编译标志。
- 将环境变量 CXX 设置为您的 C++ 编译器的名称。
- 将环境变量 CXXFLAGS 设置为您的 C++ 编译器的编译标志。
- 将环境变量 LDFLAGS 设置为您的链接器标志。
- 将环境变量 CPPFLAGS 设置为您的预处理器标志。
您不需要指定所有上述环境变量,因为对于大多数 Unix 编译器来说,默认设置是合理的。configure --help 输出中列出了更多影响力的环境变量。
如果 configure 脚本失败,您可能需要更改配置设置位于 config 目录中。有关更多信息,请参阅 "config/docs" 目录。
有关更多提示,请参阅 https://forum.dcmtk.org/faq 中的 FAQ。
祝您愉快。
M. Eichelberg, J. Riesmeier, M. Onken, J. Schlamelcher, P. Arizpe Gomez DCMTK 开发团队,德国 Oldenburg。
最后修订日期:2019-10-28(Schlamelcher)
-