Win10+VS2010上安装DCMTK3.6.3(MD支持库)安装说明
一、运行环境:WIN10 64bit + VisualStudio2010 + dcmtk3.6.3 + Cmake3.3.2
从DCMTK官网下载源代码:http://www.dcmtk.org/dcmtk.php.en。
②dcmtk-3.6.3-win64-support_MD-msvc-12.0.zip(注意,要下载***support_MD的压缩文件,而不要下载上面单独列出来的支持库)。我选择的MD,因为我的软件项目都是基于MD的运行时库。(您也可以选择dcmtk-3.6.0-win32-i386-support_MT.zip,如果您的项目是基于MT。通过项目属性的C/C++->code generation 可以更改运行时库)将这些压缩文件解压缩到硬盘上一个单独的文件夹里,我的解压缩目录是C:\DCMTK\。
1.将支持库中的相应(lib文件,include文件,bin文件)拷贝到VS2010安装目录的相应文件夹下。
A.在解压得到的支持库(dcmtk-3.6.3-win64-support_MD-msvc-12.0)的文件夹下搜索_d.lib文件(xxx_d.lib为DEBUG版本的支持库,xxx_o.lib为RELEASE版本支持库),应该会得到9个结果,将这些文件复制到一个单独的文件夹下,并把它们的名字中的_d去掉,例如将zlib_d.lib重命名为zlib.lib。将重命名后的文件拷贝至VS2010安装目录下的lib文件夹下,在我的win10_64bit电脑上是C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\。
B.在解压得到的支持库(dcmtk-3.6.3-win64-support_MD-msvc-12.0)的文件夹下搜索include,应该得到6个文件夹,将include文件夹下的内容全部复制到C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\目录下。
C.将C:\DCMTK\dcmtk-3.6.3-win64-support_MD-msvc-12.0\openssl-1.1.0g\bin下的五个文件复制到C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin下。
2. CMAKE编译
A.打开安装好的CMAKE-gui程序。关闭所有跟VS有关的程序。在where is the source code里,选择你的dcmtk源代码的位置,我的源代码位C:\DCMTK\dcmtk-3.6.3。在where to build the binaries下选择你想存放build结果的文件夹,我新建了一个C:\DCMTK\dcmtk-bin的文件夹。
B.点击Configure,选择编译环境。我的win10_64bit电脑上装的VS2010,因此我选择的Visual Studio 2010,点击finish。等待configure完成。这中间会出现***not found的信息,忽略它们。C.这时候DCMTK会列出所有的支持库的名字,勾选上openssl,png,tiff,xml和zlib,其他的保持默认。
D.勾选上Advanced复选框,这是下面的内容变多了。CMAKE_INSTALL_PREFIX下会有安装路径(我的安装路径是C:\DCMTK\dcmtk-install),自选,不要选择带有中文的目录。
E.再次点击Configure。这回Configure很快,之后点击Generate。这时候CMake使命也就完成了,可以关闭了。
3.VS2010编译
4.一个小例子,进行简单的测试这时在C:\DCMTK\dcmtk-bin下会多出来很多文件夹和文件。用VS2010打开其中的sln文件。在一个solution下会有很多个project。
A.点击“生成->配置管理器”(Build->Batch Build),选中ALL_BUILD的debug版,点击“生成->生成解决方案”。耐心等待,会有很多个warning,应该是由字符编码不统一引起的。最后会看到97个编译 成功,0个失败。
B. 之后,再选择“生成->配置管理器”(Build->Batch Build),这次选择INSTALL的debug版本,点击“生成->生成解决方案”。最后会显示3个工程编译成功,这时在你选择的安装目录下(默认是C:\Program Files\DCMTK,我的是C:\DCMTK\dcmtk-install)就会有lib,bin,include,etc,share,cmake文件夹,里面就是之后写程序做医学图像处理所需要的库文件了!
源代码:
#include <dcmtk\config\osconfig.h>
#include <dcmtk\dcmdata\dctk.h>
int main(void)
{
DcmFileFormat fileformat;
OFCondition oc = fileformat.loadFile("D:\\DCMTK\\110.DCM");
if(oc.good()){
OFString patientName;
if(fileformat.getDataset()->findAndGetOFString(DCM_PatientName, patientName).good())
{
std::cout<<"Patient Name:"<<patientName<<std::endl;
}
}
system("pause");
return 0;
}
A. 将im-0001-0001.dcm文件放在C盘目录下:C:\DCMTK\im-0001-0001.dcm。
B. 新建一个empty win32 console application,在源文件(source)文件夹下新建一个cpp文件,把以上源代码复制粘贴进去。
C. 右键单击工程名,选择属性(properties),在配置属性(Configuration Properties)->C/C++->(常规General)->附加包含目录(Additional Include Directories)里加入上一步编译出来的include文件夹,我的电脑上是C:\DCMTK\include,这一步是为了让程序能够找到头文件。
D. 在配置属性(Configuration Properties)->C/C++ ->代码生成(code generation)->运行库(Runtime Library )选择(/MDd),这一步是要和之前CMAKE的编译选项一致。
E. 在配置属性(Configuration Properties)->连接器(Linker)->常规(General)->附加包含目录(Additional Include Directories)里填写上一步编译出来的lib文件夹,我的电脑上是C:\DCMTK\lib,这一步是为了让程序能够找到之前编译好的lib文件。
F. 在配置属性(Configuration Properties)->连接器(Linker)->输入(Input)->附加包含目录(Additional Include Directories) 里依次加上wsock32.lib;netapi32.lib;ofstd.lib;oflog.lib;dcmdata.lib;zlib.lib;这一步是加入具体我们程序需要的lib文件。网上很多的帖子中,都没有提到oflog.lib这个文件,可能是由于旧的版本中并没有使用到这个文件。但是对于3.6.3版,这个lib文件是必需的。
G. Apply ,ok,编译工程,运行,这时候可能会生成失败,如果是如下错误
<1>error C2678: 二进制“+”: 没有找到接受“const wchar_t [8]”类型的左操作数的运算符(或没有可接受的转换)
<2>error C2665: “dcmtk::log4cplus::Logger::getInstance”: 2 个重载中没有一个可以转换所有参数类型
那么我们右键单击工程名,选择属性(properties),在配置属性(Configuration Properties)->(常规General)->字符集->使用多字节字符集。然后再次重新编译就不会再出现这样的问题了。
H. 我们再次重新编译,这时候可能会生成失败,如果是以下错误:
<1>error LNK2019: 无法解析的外部符号 [email protected],该符号在函数 "struct _IP_ADAPTER_INFO * __cdecl getMACAddresses(class OFVector<unsigned char> &)" ([email protected]@[email protected]@[email protected]@@@Z) 中被引用
<2>error LNK2019: 无法解析的外部符号 [email protected],该符号在函数 "int __cdecl dcmtk::log4cplus::helpers::openSocket(unsigned short,enum dcmtk::log4cplus::helpers::SocketState &)" ([email protected]@[email protected]@@[email protected]@@Z) 中被引用
第一种解决方法:
如果是第一个错误,就在cpp文件Include后添加 #pragma comment(lib, "Iphlpapi.lib")
如果是第二个错误,就在cpp文件Include后添加 #pragma comment(lib, "ws2_32.lib")
第二种解决方法:
右键单击工程名,选择属性(properties),在配置属性(Configuration Properties)->连接器(Linker)->输入(Input)->附加包含目录
(Additional Include Directories)里添加Iphlpapi.lib和ws2_32.lib
I. 然后重新编译运行,命令行应该输出Patient Name:CARCINOMIX。
Happy dcmtking!