转自:https://blog.51cto.com/u_2845385/1053291

也许是DCMTK的开发人员认为DCMTK是一个专用的库,没有必要做成动态链接库。 
也许是DCMTK的开发人员认为DCMTK需要跨平台,做成动态链接库就平台相关了,违背了跨平台的本意。
       正因为这两个"也许",造成DCMTK经过编译之后总是得不到DLL文件。DCMTK到底能不能编译成DLL来使用呢?反正我是失败了。你来试试。不过在编译DCMTK的过程中也解决了不少棘手问题。不感独享。

我用的编译环境是VC8(就是VS2005)里面的VC。我们编译的目的是使DCMTK能和我们现在使用的MFC良好协作。我们学习都是螺旋渐进式学习的(提出结论,然后推翻结论,得出新结论),我们也这样,并得到了以下结论。

结论一、只能使用MBCS字符集:
    使用VC编写程序,总是离不开字符串,需要使用字符串CString。而VC呢?又支持各种不同的字符串编码。那么CMake创建的DCMTK项目,里面默认的什么字符串编码呢?好象VC8向导创建的项目,默认就是Unicode,而不是MBCS哦。正好相反,需要注意。CMake创建的DCMTK项目里面都使用的MBCS字符集。那么以后使用VC编写DCMTK应用程序的时候,还是使用MBCS字符集吧。毕竟DCMTK太大了,修改起来不太方便。以后,我们就不讨论Unicode版本的应用程序啦,只考虑使用MBCS的应用程序。

结论二、只能编译成静态连接库
    DCMTK只能编译成静态连接库。
    为什么呢?因为我们按照默认的办法编译DCMTK之后,找不到任何DLL文件。全部是一大堆的LIB文件和.H文件。

结论三、需要C语言运行库
    VC书写的程序都需要使用C语言运行库(里面实现了标准的C语言函数哦,比如IOSTREAM等东西)。

结论四:
    C语言运行库的引如方式有两种。与MFC的用法一样,有动态链接的方式和静态链接的方式。也就是编译参数/MT /MTd /MD /MDd负责控制啦。
    /MT负责链接发行版的C语言运行库(静态链接)。
    /MTd负责链接调试版的C语言运行库(静态链接)。
    /MD负责链接发行版的C语言运行库(动态链接)。
    /MDd负责链接调试版的C语言运行库(动态链接)。
    
    我们都知道动态链接MFC的时候,应用程序运行时会要求提供MFC对应的DLL。
    VC6的需要MFC4.2的DLL。调试版的程序会自动引入MFC42D.DLL。发行版的会自动引入MFC42.DLL。MFC42U.DLL呢?(那是Unicode版本的MFC,前面都说啦,不讨论了)。VC8提供的DLL形式的MFC又是另外一个模样,叫做MFC80.DLL。

结论五、静态链接方式链接语言运行库
DCMTK使用的是静态链接方式链接语言运行库。使用默认的DCMTK编译参数,生成的LIB文件。在使用的时候,需要注意以下问题。
    ①需要设置项目的字符类型为MBCS,可以判断有没有定义文本宏_MBCS;
    ②需要设置项目使用语言运行库的方法为静态链接,可以判断有没有定义文本宏(_MDd,_MD,_MT,MTt);
    ③需要静态链接MFC,可以判断有没有定义文本宏(_AFXDLL);
    ④需要链接很多库,可以通过在源文件中编写代码实现, 提高重用度
        #pragma comment(lib,"ofstd")
        #pragma comment(lib,"dcmdata")
        #pragma comment(lib,"dcmtls")
        #pragma comment(lib,"dcmnet")
        #pragma comment(lib,"dcmqrdb")
        #pragma comment(lib,"dcmimgle")
        #pragma comment(lib,"dcmp_w_picpath")
        #pragma comment(lib,"dcmjpeg")
        #pragma comment(lib,"ijg8")
        #pragma comment(lib,"ijg12")
        #pragma comment(lib,"ijg16")
        #pragma comment(lib,"dcmdsig")
        #pragma comment(lib,"dcmsr")
        #pragma comment(lib,"dcmpstat")
        #pragma comment(lib,"dcmwlm")
        #pragma comment(lib,"netapi32")
        #pragma comment(lib,"wsock32")
    。

结论六、独立性和完整性都最好
    按照结论五编写出来的应用程序是很大的。但是独立性和完整性都最好。我写了个简单的Demo。调试版的大小是4.05M,发行版的大小是1.10M。但是复制到什么地方都可以运行,根本不需要其它额外的动态连接库。

结论七:
    有时必须调整DCMTK链接语言运行库的方式(变静态链接为动态链接)。
    比如,要写扩展MFC的DLL时,就必须采用动态链接的方式使用MFC。VC要求,采用动态链接的方式使用MFC就必须采用用动态链接的方式使用语言库。如果DCMTK采用静态方式链接语言库,使用DCMTK的程序采用动态方式链接,那么就会出现语言库中的符号符号重复定义的情况。怎么办呢?能不能在最后链接的时候在统一指定语言库的使用方式呢?这个我测试了,好象不行。哪位大侠搞定了通知我下。我采用的办法是重新编译DCMTK。修改其语言库链接方式。如何操作呢?
    替换所有CMakeLists.txt中的/MT为/MD (根据经验其实也就根目录下的CMakeLists.txt中存在)。重新编译DCMTK。这样一来,我们的程序就可以采用动态链接的方式使用MFC了。 
    这次编译出来的程序,大小还可以。我把需要用到的功能用MFC扩展的DLL进行了包装。调试版本的DCMTK.DLL大小为1.92M;发行版本的DCMTK.DLl大小为884K;调试版本的Demo.EXE文件大小为152K;发行版本的Demo.EXE大小为48K。其实DCMTK.DLL的维护完全可以安排一个专人负责。一般调试完毕之后,变化是很少的。如此以来,调试程序的时候,编译速度快多了。

【转】编译DCMTK相关推荐

  1. Qt5.5.0环境下的mingw编译dcmtk 3.6.1_20150924

    网上关于mingw编译dcmtk的文章太少,不方便查阅,期间遇到各种问题.特意将整个编译过程记录下来.为了保证所有编译出来的文件方便我在Qt5.5.0中使用,将所有的dcmtk依赖的外部库下载下来并进 ...

  2. dcmtk编译 android,windows下编译dcmtk的Android版本

    1.下载最新的dcmtk http://support.dcmtk.org/redmine/attachments/download/77/dcmtk-3.6.1_20150217.tar.gz解压. ...

  3. DCMTK+VS2012编译简明教程

    环境:win7x64,VS2012,DCMTK3.6.0 DCMTK相关资料汇总: ※官方文档:http://support.dcmtk.org/docs-snapshot/ ※源码.支持库下载:ht ...

  4. php pacs,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class – 只要踏出一步,路就在前方——zssure – CSDN博客...

    背景: 预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的WML服务器计划遇到了问题.起初以为参照DCMTK的官方文档wwwapp.txt结合前两天搭建的WAMP服务器可以顺利的实现WM ...

  5. 基于DCMTK的DICOM相关程序编写攻略

    2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常 ...

  6. DICOM医学图像处理:Dcmtk与fo-dicom保存文件的不同设计模式之“同步VS异步”+“单线程VS多线程”...

    2019独角兽企业重金招聘Python工程师标准>>> 一.背景: 最近一直在做DCM相关的编程工作,以前项目使用C++居多,所以使用DCMTK开源库,而目前团队使用C#居多,所以需 ...

  7. java读取dcm影像文件_使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像

    借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...

  8. 3DSlicer6:编译、调试、规范化的开发

    1.编译 Step1:CMake生成Slicer工程文件 使用Cmake生成Slicer的解决方案(Solution)包括两小点: 指定源代码目录:C:/myProjects/Slicer4:目标目录 ...

  9. dcmtk程序包综述(1)

    1.前言 简单列出dcmtk程序包的简介,包括主要接口类的简单说明,可用工具以及一些例子.下一步工作准备详细分析每个程序包中的接口类功能,并结合源码和dicom文档分析其实现过程. 2.Config程 ...

最新文章

  1. 如何安排vixta之三-Installing来源劈脸安排
  2. delphi使用sqlite数据库时的中文路径问题
  3. Android数据库高手秘籍(二):创建表和LitePal的基本用法
  4. 小蚂蚁学习Redis笔记(13)——Redis之phpredis的安装
  5. IDEA 插件开发入门教程
  6. java多线程通信基础(面向厕所编程)
  7. python面试题之docstring是什么?
  8. IaaS、PaaS、SaaS、BaaS、FaaS、APaaS、IPaaS、IDaaS、DaaS
  9. demo10 关于JS Tree Shaking
  10. 解决js跨域使用nginx配置问题
  11. 轻云,云虚拟,ECS差别
  12. STM32 - Cube介绍
  13. 超链接小点html,html超链接取消鼠标点指显示小手
  14. 用window.dialogArguments时出现window.dialogArguments is undefined
  15. 系统篇-在linux上用deb包安装steam。
  16. 模块化存储区域网络(SAN)解决方案的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. unity中世界坐标与局部坐标
  18. Java 开通会员增加会员天数(LocalDateTime)
  19. 发光二极管压降, 也就是最小导通电压
  20. 三层交换机实现vlan间通信

热门文章

  1. java客户姓名添加和查找_java类与对象 演练 客户姓名添加与查看
  2. java处理url中的特殊字符%等
  3. easyui(一) 初始easyui
  4. 避免Eclipse经常出现Out Of Memory
  5. 谈谈基于SQL Server 的Exception Handlingp[下篇]
  6. web开发常用js功能性小技巧(转)
  7. [小技巧][JAVA][转换]List, Integer[], int[]的相互转换
  8. [Leedcode][JAVA][第15题][三数之和][数组][双指针]
  9. 发生系统错误53_SAP那些事-推理剧-36-奇怪的付款清账(F-53)报错“TABLE_INVALID_INDEX”...
  10. 简述oracle的主要数据库对象,Oracle数据库数据对象分析