实验平台
- Visual Studio 2010
- 已编译的 DCMTK 3.6.2 Debug x64版本
关于DCMTK的编译方法,参见 DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建
实验步骤
- 在VS2010中新建Visual C++ Win32 控制台应用程序 空项目,命名为DcmtkDemo
- 在源文件中添加新建项 .cpp 文件,命名为main.cpp
- 粘贴如下测试代码,代码来源为 DICOM医学图像处理:基于DCMTK工具包学习和分析worklist
#include <stdio.h>
#include <tchar.h>
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/dcmdata/dcpxitem.h"
#include "dcmtk/dcmjpeg/djdecode.h"
#include "dcmtk/dcmjpeg/djencode.h"
#include "dcmtk/dcmjpeg/djcodece.h"
#include "dcmtk/dcmjpeg/djrplol.h"
using namespace std;
int main()
{
char uid[100];
DcmFileFormat fileformat;
DcmDataset *dataset = fileformat.getDataset();
/**********************************************
*
*利用下列语句可以生成worklist的数据库文件,即
*不含有影像信息的dcm文件
*
************************************************/
dataset->putAndInsertString(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage);
dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
dataset->putAndInsertString(DCM_PatientName, "Doe^John");
OFCondition status = fileformat.saveFile("D:\\DcmWorklist\\worklist\\test.wl", EXS_LittleEndianExplicit);
if (status.bad())
cerr << "Error: cannot write DICOM file (" << status.text() << ")" << endl;
return 0;
}
3.将已编译好的DCMTK库拷贝至项目目录下(与DcmtkDemo.sln放在一个目录下),本机中位置为E:\Projects\DcmtkDemo\DCMTK
4. 设置项目属性
- 点击项目>>属性>>配置属性>>常规>>字符集 将“使用Unicode字符集”改为 “使用多字节字符集”
- 属性->调试->环境 增加 path=$(SolutionDir)\DCMTK\bin; 重新启动VS
- 属性>>VC++目录>>包含目录 添加 $(SolutionDir)\DCMTK\include
- 属性>>C/C++>>代码生成>>运行库 改为 多线程调试 DLL (/MDd)
- 属性>>链接器>>常规>>附加库目录 添加
$(SolutionDir)\DCMTK\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
- 由于使用的dcmtk库是x64版本,生成时需要在配置管理器中将平台改为x64
- 编译运行
可能遇到的问题及解答
- 错误信息:
dcmtk\oflog\tracelog.h(59): error C2678: 二进制“+”: 没有找到接受“const wchar_t [8]”类型的左操作数的运算符(或没有可接受的转换)
......
error C2665: “dcmtk::log4cplus::Logger::getInstance”: 2 个重载中没有一个可以转换所有参数类型
- 原因:dcmtk不支持Unicode字符集,需要将字符集设置为多字节字符集
- 解决方法:点击项目>>属性>>配置属性>>常规>>字符集 将“使用Unicode字符集”改为 “使用多字节字符集”
- 错误信息:
main.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall DcmFileFormat::~DcmFileFormat(void)" (__imp_??1DcmFileFormat@@UAE@XZ),该符号在函数 _main 中被引用
.......
fatal error LNK1120: 15 个无法解析的外部命令
- 原因:
①错误使用Win32平台进行Debug,导致无法识别用x64编译的dcmtk库
②未将 $(SolutionDir)\DCMTK\lib 添加 到链接器附加库目录
③未将相应 .lib 文件加入附加依赖项 - 解决方法:
①生成时在配置管理器中将平台改为 x64
②属性>>链接器>>常规>>附加库目录 添加
$(SolutionDir)\DCMTK\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
- 错误信息:程序生成成功,运行时出现错误
- 原因:程序运行时找不到.dll库
- 解决方法:属性->调试->环境 增加 path=$(SolutionDir)\DCMTK\bin; 重新启动VS2010
- error LNK2001: unresolved external XXX
参见 Compilation of DCMTK-based program fails with LNK2001 [MSVC]