目录
一、下载
- 这里选择 3.6.7 进行编译
- 需要同时下载 源码 dcmtk-3.6.7.zip ——【该版本遇坑,可先查看2.4问题解决,重新从Git上下载修复过的文件】以及支持库dcmtk-3.6.7-win64-support-MD-iconv-msvc-16.9.zip
- 解压并构建如下目录结构
二、CMake构建
1、参数配置
- 下载CMake,这里不做赘述,本人使用的是 3.27.4(以免遇坑,可以下载3.13版本)
- 选择源码路径和构建输出路径
- 勾选 Grouped 和 Advanced 以打开全局配置和分组
- 点击左下角 Configure 配置编译器
- 点击 Finish 之后会开始检测系统环境,等待一段时间
2、分组设置
【BUILD】
- 开启【BUILD_SHARED_LIBS】,设置构建动态库
- 开启【BUILD_SINGLE_SHARED_LIBRARY】设置输出为一个dll
【CMAKE】
- 因为是构建动态库,所以将所有MT/MTd修改为MD/MDd
- 设置【CMAKE_DEBUG_POSTFIX】参数为d,以在debug版本增加d后缀
- 修改【CMAKE_INSTALL_PREFIX】参数为F:/DCMTK367/dcmtk-3.6.7-install,重新设置安装目录
【DCMTK】
- 设置【DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS】关闭,不然之后VS编译会报错(构建动态库需要,原因未知)
- 【DCMTK_ENABLE_CXX11】设置为 【ON】
- 开启以下几个配置
【DCMTK_COMPILE_WIN32_MULTITHREADED_DLL】
【DCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS】
【DCMTK_ENABLE_STL】
【DCMTK_WITH_ICOV】
【DCMTK_WITH_OPENSSL】
【DCMTK_WITH_OPENJPEG】
【DCMTK_WITH_PNG】
【DCMTK_WITH_TIFF】
【DCMTK_WITH_XML】
【DCMTK_WITH_ZLIB】
【WITH】
设置支持包的路径
3、工程生成
- 分组配置设置完成后,点击 Configure,等待 Configuring done.
- 点击 Generate,生成VS工程,等待 Generating done.
- 点击 Open Project,打开工程文件
4、问题解决
三、VS工程编译
- 点击 工具栏—生成—批生成 ,勾选ALL_BUILD的Debug和Release版本,点击生成,等待结束(耗时较长)
- 编译完成后,再次打开批生成,勾选INSTALL的Debug和Release
- 等待完成后,在F:\DCMTK367\dcmtk-3.6.7-install下会自动部署DCMTK相关文件
四、过程中遇到的问题
1、CMake报错
CMake Error at dcmtls/libsrc/CMakeLists.txt:13 (set_property):
set_property could not find TARGET dcmtls. Perhaps it has not yet been
created.
CMake Error at dcmnet/libsrc/CMakeLists.txt:49 (set_property):
set_property could not find TARGET dcmnet. Perhaps it has not yet been
created.
CMake Error at dcmsign/libsrc/CMakeLists.txt:26 (set_property):
set_property could not find TARGET dcmdsig. Perhaps it has not yet been
created.
CMake Error at dcmpstat/libsrc/CMakeLists.txt:51 (set_property):
set_property could not find TARGET dcmpstat. Perhaps it has not yet been
created.
通过该帖解决问题,原因未知,怀疑与CMake的版本和Dcmtk_CMakeLists的设置有关无法构建 DCMTK-3.6.7 - DICOM @ OFFIShttps://forum.dcmtk.org/viewtopic.php?t=5178从Github上下载了经过修复兼容的版本后,生成ok
2、VS编译报错
F:\DCMTK367\dcmtk-3.6.7\dcmsr\libcmr\cid4031e.cc(42,6): error C2001: 常量中有换行符
F:\DCMTK367\dcmtk-3.6.7\dcmsr\libcmr\cid4031e.cc(42,6): error C2064: 项不会计算为接受 1 个参数的函数
F:\DCMTK367\dcmtk-3.6.7\dcmsr\libcmr\cid4031e.cc(98,6): error C2001: 常量中有换行符
F:\DCMTK367\dcmtk-3.6.7\dcmsr\libcmr\cid4031e.cc(98,6): error C2064: 项不会计算为接受 1 个参数的函数
F:\DCMTK367\dcmtk-3.6.7\dcmsr\libcmr\cid4031e.cc(102,6): error C2001: 常量中有换行符
F:\DCMTK367\dcmtk-3.6.7\dcmsr\libcmr\cid4031e.cc(102,6): error C2064: 项不会计算为接受 1 个参数的函数
F:\DCMTK367\dcmtk-3.6.7\dcmsr\libcmr\cid4031e.cc(134,2): error C2059: 语法错误:“;”
F:\DCMTK367\dcmtk-3.6.7\dcmsr\libcmr\cid4031e.cc(136,71): error C2070: “const DefinedTermTypeMapStruct []”: 非法的 sizeof 操作数
定位报有换行符的位置,可以发现末尾多了个字符,删掉即可